為了使用qt自帶的socket進行網路程式設計,先必須熟悉socket程式設計的原理,另外還需對qt一些基本類的操作比較熟悉。由於剛接觸不久,所以還是以看人家的**來學習。這次主要是學qt下udp的程式設計,且熟悉一些qt下**的編寫流程,所以本文參照的是《qt及qt quick開發實戰精解》一書中的第5個例子:區域網聊天工具中的udp聊天部分。
該程式實現的是每個使用者登入既是客戶端又是伺服器端,這就需要看你站在哪個角度看問題了。簡單的說,當使用者傳送資訊給別人時就是客戶端,當接收別人的資訊是就可以看做是伺服器端。
下面分伺服器端和客戶端2部分來介紹。
伺服器端:建立乙個udp socket並繫結在固定埠後,用訊號與槽的方式進行監聽是否有資料來臨。如果用,接收其資料並分析資料的訊息型別,如果訊息是新使用者登入則更新使用者列表並在聊天顯示視窗中新增新使用者上線通知;同理,如果是使用者下線,則在使用者列表中刪除該使用者且在聊天顯示視窗中顯示下線通知;如果是聊天訊息,則接收該訊息並且在視窗中顯示。其流程圖如下:
客戶端:首先當客戶端登入時,獲取本機的使用者名稱,計算機名和ip位址,並廣播給區域網的伺服器更新使用者列表。然後當客戶端需要傳送資訊時,則在聊天輸入欄中輸入資訊並按傳送鍵傳送聊天內容,當然於此同時也廣播本地系統的各種資訊。其流程圖如下:
程式主要**和注釋如下:
widget.h:
#ifndef widget_hwidget.cpp:#define widget_h#include
class
qudpsocket;
namespace
ui //
列舉變數標誌資訊的型別,分別為訊息,新使用者加入,使用者退出,檔名,拒絕接受檔案
enum
messagetype;
class widget : public
qwidget
;#endif
//widget_h
#include "main:widget.h
"#include
"ui_widget.h
"#include
#include
#include
#include
#include
#include
#include
widget::widget(qwidget *parent) :
qwidget(parent),
ui(newui::widget)
widget::~widget()
//使用udp廣播傳送資訊,messagetype是指頭檔案中的列舉資料型別
//sendmessage即把本機的主機名,使用者名稱+(訊息內容後ip位址)廣播出去
void
widget::sendmessage(messagetype type, qstring serveraddress)
out<< address << getmessage();//
將ip位址和得到的訊息內容輸入out資料流
ui->messagebrowser->verticalscrollbar() //
返回垂直條
->setvalue(ui->messagebrowser->verticalscrollbar()->maximum());//
設定垂直滑動條的最大值
break
;
case
newparticipant :
out<< address; //
為什麼此時只是輸出位址這一項呢?因為此時不需要傳遞聊天內容
break
;
case
participantleft :
break
;
case
filename :
break
;
case
refuse :
break
; }
//乙個udpsocket已經於乙個埠bind在一起了,這裡的data是out流中的data,最多可以傳送8192個位元組,但是建議不要超過
//512個位元組,因為這樣雖然可以傳送成功,但是這些資料需要在ip層分組,qhostaddress::broadcast是指傳送資料的目的位址
//這裡為本機所在位址的廣播組內所有機器,即區域網廣播傳送
udpsocket->writedatagram(data,data.length(),qhostaddress::broadcast, port);//
將data中的資料傳送}//
接收udp資訊
void
widget::processpendingdatagrams()
}}//
處理新使用者加入
void
widget::newparticipant(qstring username, qstring localhostname, qstring ipaddress)}//
處理使用者離開
void
widget::participantleft(qstring username, qstring localhostname, qstring time)
//獲取ip位址,獲取本機ip位址(其協議為ipv4的ip位址)
qstring widget::getip()
return0;
}//獲取使用者名稱
qstring widget::getusername()}}
return
"unknown";
}//獲得要傳送的訊息
qstring widget::getmessage()
//傳送訊息
void
widget::on_sendbutton_clicked()
"widget.h
"#include
//處理不同語言編碼的類
int main(int argc, char *ar**)
Qt學習之路 4 Qt UDP的初步使用
為了使用qt自帶的socket進行網路程式設計,先必須熟悉socket程式設計的原理,另外還需對qt一些基本類的操作比較熟悉。由於剛接觸不久,所以還是以看人家的 來學習。這次主要是學qt下udp的程式設計,且熟悉一些qt下 的編寫流程,所以本文參照的是 qt及qt quick開發實戰精解 一書中的第...
Qt學習之路 4 Qt UDP的初步使用
為了使用qt自帶的socket進行網路程式設計,先必須熟悉socket程式設計的原理,另外還需對qt一些基本類的操作比較熟悉。由於剛接觸不久,所以還是以看人家的 來學習。這次主要是學qt下udp的程式設計,且熟悉一些qt下 的編寫流程,所以本文參照的是 qt及qt quick開發實戰精解 一書中的第...
Qt學習之路 4 建立對話方塊
void mainwindow open void mainwindow open 不過,這樣做有乙個問題 如果我們的對話方塊不是在乙個介面類中出現呢?由於qwidget的 parent 必須是qwidget指標,那就限制了我們不能將乙個普通的 c 類指標傳給 qt 對話方塊。另外,如果對記憶體占用...