QT TCP實現(xiàn)簡單的通信示例
本文實例為大家分享了QT TCP實現(xiàn)簡單通信示例的具體代碼,供大家參考,具體內(nèi)容如下
TCP服務(wù)端:
第一步: 創(chuàng)建監(jiān)聽套接字的QTcpSever
QTcpServer *m_tsTcpServer;
第二步: listen------監(jiān)聽是否有新的連接進來
int iMyport;如果有新的客戶端連接的話,會觸發(fā)信號newConnection(),定義一個槽函數(shù)接收連接好的套接字.
//監(jiān)聽的端口號 iMyport = iPort; //判斷是否接收到了新的連接 if(m_tsTcpServer->listen(QHostAddress::Any,iMyport)) ? ? { ? ? ? ? connect(m_tsTcpServer,SIGNAL(newConnection()),this,SLOT(slotServerNewConnection())); ? ? } ? ? else ? ? { ? ? ? ? qDebug() << "server listen error"; ? ? }
第三步: 取出套接字
QTcpSocket *m_tsTcpSocket; 如果客戶端有消息進來的話,會觸發(fā)信號readyRead();斷開連接的話會觸發(fā)disconnected();
//獲得連接客戶端的SOCKET套接字 m_tsTcpSocket = m_tsTcpServer->nextPendingConnection(); //獲取對方的IP和端口 QString sIp = m_tsTcpSocket->peerAddress().toString(); quint16 sPort = m_tsTcpSocket->peerPort(); qDebug() << sIp << sPort; connect(m_tsTcpSocket,SIGNAL(readyRead()),this,SLOT(slotServerReadData())); connect(m_tsTcpSocket, SIGNAL(disconnected()), this, SLOT(slotServerDisConnection()));
第四步: 讀取套接字的內(nèi)容
//從socket中讀出數(shù)據(jù) QByteArray baArray = m_tsTcpSocket->readAll(); QString sMsg = baArray;
到此服務(wù)端簡單的通信搭建就完成了.
TCP客戶端:
第一步: 創(chuàng)建套接字,與服務(wù)端的IP地址和端口號連接.注:這里的端口號和上面服務(wù)端綁定的那個端口號是一樣的,別搞錯了.
//連接服務(wù)端 m_tsTcpSocket->connectToHost(sIP,iPort); //成功連接返回true,錯誤返回false if(m_tsTcpSocket->waitForConnected()) ? ? { ? ? ? ? qDebug() << "connect success"; ? ? } ? ? //成功連接會觸發(fā)槽函數(shù) 如果在找在這個槽函數(shù)里寫write的話只能寫一次,所以可以等連接成功后自己把寫的函數(shù)放在自己想要發(fā)送的模塊 ? ? //connect(m_tsTcpSocket,SIGNAL(connected()),this,SLOT(slotConnectedSuccess()));
第二步: 連接成功后就可以直接向服務(wù)端發(fā)消息了.
QString str; int iSize = m_tsTcpSocket->write(str.toUtf8().data());//返回字節(jié)的大小 //等待write寫完再寫下一次的write ? ? if(!m_tsTcpSocket->waitForBytesWritten(50000)) ? ? { ? ? ? ? return; ? ? } ? ? //判斷發(fā)送是否成功 ? ? if(iSize ==-1) ? ? { ? ? ? ? qDebug() << "write error"; ? ? ? ? return; ? ? }
到此客戶端的簡單通信就搭建好了.
若要多次向服務(wù)端發(fā)消息,可以while循環(huán)或者是其他.在這里要注意如果要多次發(fā)消息的話,waitForBytesWritten()這個函數(shù)是必不可少的,不然多次的話可能通信會失敗.
注:write()函數(shù)和被觸發(fā)的讀的readyRead()信號并不是一一對應(yīng)的,比如可能你客戶端write了三次,服務(wù)端那邊的readyRead可能才被觸發(fā)一次.
想要了解詳細的原因可以自己再去了解.
同理服務(wù)端向客服端發(fā)消息的話直接發(fā)送就可,服務(wù)端要收消息的話也是直接讀就好,因為連接已經(jīng)成功了.
相信小聰明腦袋瓜的你能懂的.
補充:客戶端主動斷開服務(wù)的連接
void TcpClient::disConnectSever() { ? ? //方式一 ? ? m_tcpSocket->flush(); ? ? m_tcpSocket->disconnectFromHost(); ? ?? ? ? //方式二 ? ? m_tcpSocket->abort(); }
注:方式二abort與方式一的區(qū)別:abort中止當(dāng)前連接并重置套接字。與disConnectFromHost()不同,該函數(shù)會立即關(guān)閉套接字,丟棄寫緩沖區(qū)中的所有掛起數(shù)據(jù)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C語言結(jié)構(gòu)體中的char數(shù)組如何賦值
這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體中的char數(shù)組如何賦值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03C++?opencv圖像處理實現(xiàn)圖片邊緣檢測示例
這篇文章主要為大家介紹了C++?opencv實現(xiàn)圖片邊緣檢測示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法
這篇文章主要為大家詳細介紹了C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01