一、TCP/UDP通信在Qt中的實現過程:
廢話不說,首先下面是Qt中TCP/UDP的實現圖解:
1.Qt下TCP通信詳解:
針對上圖進行簡單的說明:
QTcpServer用來創建服務器對象,服務器對象創建以后,調用成員函數listen()進行監聽某個IP和某個端口,其中listen()包含了IP和Port(即地址和端口)。其實服務器的監聽操作是用來將該服務器和某個地址以及某個端口綁定。你可以理解為Qt為了區分服務器和客戶端而創造了監聽操作。具體代碼如下:
1 _server = new QTcpServer; 2 _server->listen(QHostAddress("127.0.0.1"), 9988);
當服務器對象創建完成,並進行了監聽(綁定)后,服務器就一直在監聽,而客戶端用QTcpSocket創建與服務器進行通信的Tcp通信對象,使用成員函數connectToHost()進行發起連接操作,當服務器接收到連接請求完成三次握手之后,連接成功。而此時服務器的 QTcpServer 對象會觸發一個 newConnection() 信號,而對該信號,我們加以處理,在其槽函數中取出建立連接后服務器端創建的用於通信的 QTcpSocket 對象(nextPendingConnection()返回這樣一個對象)注意:此時服務器有兩個對象,QTcpServer 和 QTcpSocket 對象,一個用來監聽一個用來通信。連接成功之后,客戶端也會觸發一個connected()連接成功的信號。這樣就可以開始進行數據傳輸。
當服務器的 QTcpSocket 對象和客戶端的 QTcpSocket 對象進行數據交換時,發送方發送數據(write()),對端檢測信號readyRead(),如果發送成功,則readyRead()信號就會被觸發,此時我們只要在readyRead()信號的槽函數中實現數據的接受讀取(read()、readAll()等)即可。
2、Qt Udp通信(QUdpSocket):
Udp比Tcp簡單的多,因為服務器不需要進行監聽,顯得和客戶端並無兩樣,只需要知道對端的IP和端口就能進行數據傳輸,但是卻不保證一定能完成消息的抵達(這就是TCP與UDP的一個主要區別:TCP會粘包但是不會丟包,而UDP會丟包不會粘包),(我們會在測試中用同一段代碼來測試客戶端與服務器,因為對於單線程/進程來說其實就是沒有區別)。其次,TCP與UDP的數據形式不同,所以UDP的數據接收成員函數,自然不能用TCP的簡單的read、write(流式數據),而要使用readDatagram、writeDatagram。
二、TCP/UDP通信的代碼測試
注意:在使用到TCP/UDP時,需要在工程文件 xxx.pro 中加上:”QT += network”
1.TCP 實現服務器端和客戶端聊天(代碼文件多不好貼上,如需要留言郵箱必回)
如上:服務器可以選擇IP地址和端口綁定或連接(包括服務器自身和客戶端),客戶端可以綁定連接服務器(先服務器綁定再客戶端連接)。
2.UDP實現各個用戶之間聊天(代碼文件多不好貼上,如需要留言郵箱必回)
文章部分引用自:https://blog.csdn.net/Apollon_krj/article/details/72857828



