QT TCP實現簡單的通信示例
本文實例為大傢分享瞭QT TCP實現簡單通信示例的具體代碼,供大傢參考,具體內容如下
TCP服務端:
第一步: 創建監聽套接字的QTcpSever
QTcpServer *m_tsTcpServer;
第二步: listen——監聽是否有新的連接進來
int iMyport;如果有新的客戶端連接的話,會觸發信號newConnection(),定義一個槽函數接收連接好的套接字.
//監聽的端口號 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; 如果客戶端有消息進來的話,會觸發信號readyRead();斷開連接的話會觸發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()));
第四步: 讀取套接字的內容
//從socket中讀出數據 QByteArray baArray = m_tsTcpSocket->readAll(); QString sMsg = baArray;
到此服務端簡單的通信搭建就完成瞭.
TCP客戶端:
第一步: 創建套接字,與服務端的IP地址和端口號連接.註:這裡的端口號和上面服務端綁定的那個端口號是一樣的,別搞錯瞭.
//連接服務端 m_tsTcpSocket->connectToHost(sIP,iPort); //成功連接返回true,錯誤返回false if(m_tsTcpSocket->waitForConnected()) { qDebug() << "connect success"; } //成功連接會觸發槽函數 如果在找在這個槽函數裡寫write的話隻能寫一次,所以可以等連接成功後自己把寫的函數放在自己想要發送的模塊 //connect(m_tsTcpSocket,SIGNAL(connected()),this,SLOT(slotConnectedSuccess()));
第二步: 連接成功後就可以直接向服務端發消息瞭.
QString str; int iSize = m_tsTcpSocket->write(str.toUtf8().data());//返回字節的大小 //等待write寫完再寫下一次的write if(!m_tsTcpSocket->waitForBytesWritten(50000)) { return; } //判斷發送是否成功 if(iSize ==-1) { qDebug() << "write error"; return; }
到此客戶端的簡單通信就搭建好瞭.
若要多次向服務端發消息,可以while循環或者是其他.在這裡要註意如果要多次發消息的話,waitForBytesWritten()這個函數是必不可少的,不然多次的話可能通信會失敗.
註:write()函數和被觸發的讀的readyRead()信號並不是一一對應的,比如可能你客戶端write瞭三次,服務端那邊的readyRead可能才被觸發一次.
想要瞭解詳細的原因可以自己再去瞭解.
同理服務端向客服端發消息的話直接發送就可,服務端要收消息的話也是直接讀就好,因為連接已經成功瞭.
相信小聰明腦袋瓜的你能懂的.
補充:客戶端主動斷開服務的連接
void TcpClient::disConnectSever() { //方式一 m_tcpSocket->flush(); m_tcpSocket->disconnectFromHost(); //方式二 m_tcpSocket->abort(); }
註:方式二abort與方式一的區別:abort中止當前連接並重置套接字。與disConnectFromHost()不同,該函數會立即關閉套接字,丟棄寫緩沖區中的所有掛起數據。
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。