qt linux 网络聊天室,QT tcp网络聊天室群聊的实现
tcp編程通過分成 服務(wù)器 端與客戶端
在QT里, tcp編程需用到兩個(gè)類: QTcpServer, QTcpSocket
服務(wù)器端:
//1. 創(chuàng)建一個(gè)QTcpServer對象
QTcpServer *server = new QTcpServer;
//2. 調(diào)用對象的listen函數(shù)成員進(jìn)行綁定地址與端口號(hào), 并監(jiān)聽端口
server->listen(QHostAddress::Any, 9999); // 綁定端口號(hào)9999, 成功返回true, 失敗返回false
// 3. 連接對象的newConnection信號(hào)到一個(gè)槽函數(shù),用于處理客戶端的連接。
connect(server, SIGNAL(newConnection()), this, SLOT(new_client())); //當(dāng)有客戶端連接時(shí),對象會(huì)發(fā)出newConnection信號(hào),客戶端的連接處理就在觸發(fā)的槽函數(shù)new_client里處理了。
// 4. 在處理客戶端連接的槽函數(shù)new_client里處理連接. 每個(gè)客戶端連接上來后,在服務(wù)器端就會(huì)有一個(gè)QTcpSocket對象對一個(gè)客戶端通信使用,如多個(gè)客戶端連接上來,則會(huì)有多個(gè)QTcpSocket對象.
QTcpSocket *client;
client = server->nextPendingConnection(); //處理客戶端連接, 調(diào)用此處理函數(shù)后,會(huì)得到一個(gè)QTcpSocket對象的地址,此對象專用于這個(gè)連接上來的客戶端通信使用。
// QTcpSocket對象在服務(wù)器端用于與客戶端通信使用,當(dāng)客戶端發(fā)數(shù)據(jù)到服務(wù)器端時(shí),它會(huì)發(fā)出信號(hào)readyRead, 通知接收客戶端的數(shù)據(jù). 當(dāng)客戶端斷開連接時(shí),會(huì)發(fā)出disconnected信號(hào),通知客戶端已斷線.發(fā)送數(shù)據(jù)則調(diào)用對象的write函數(shù)即可.
//連接信號(hào),做相應(yīng)的處理
connect(client, SIGNAL(readyRead()), this, SLOT(tcp_read())); // tcp_read槽函數(shù)用于接收客戶端的數(shù)據(jù), 在槽函數(shù)里調(diào)用QTcpSocket對象的read函數(shù)即可.
connect(client, SIGNAL(disconnected()), this, SLOT(lost_client())); // lost_client槽函數(shù)用于處理客戶端斷開連接
客戶端:
// 1. 創(chuàng)建QTcpSocket對象
QTcpSocket *tcp = new QtcpSocket;
// 2. 連接服務(wù)器端的IP地址與端口號(hào), 連接成功會(huì)發(fā)出connected信號(hào)。也可以直接調(diào)用waitForConnected等待連接的結(jié)果。
tcp->connectToHost("192.168.250.250", 9999);
// 3. 調(diào)用對象的read/write函數(shù)即可與服務(wù)器端進(jìn)行收發(fā)數(shù)據(jù)了。當(dāng)服務(wù)器端有發(fā)數(shù)據(jù)過來時(shí),會(huì)發(fā)出readyRead信號(hào),在連接此信號(hào)的槽函數(shù)里接收數(shù)據(jù)即可.
網(wǎng)絡(luò)聊天室的技術(shù)要點(diǎn):
因在服務(wù)器端每個(gè)客戶端連接,都會(huì)產(chǎn)生一個(gè)QTcpSocket對象用于與對應(yīng)的客戶端通信。而客戶端個(gè)數(shù)是不確定的,所以可以用 QList
的鏈表存放每個(gè)對象的地址。
群發(fā)的實(shí)現(xiàn):
接收到客戶端發(fā)過來的內(nèi)容后,遍歷鏈表,給每個(gè)客戶端發(fā)送同一份內(nèi)容即可。
總結(jié)
以上是生活随笔為你收集整理的qt linux 网络聊天室,QT tcp网络聊天室群聊的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL三维小球碰撞实现方法(glm
- 下一篇: 国内开源镜像(下载Linux系统)