日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Qt网络程序:基于TCP的服务器、客户端实例

發(fā)布時(shí)間:2023/12/18 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt网络程序:基于TCP的服务器、客户端实例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先我們需要設(shè)置服務(wù)器:?
項(xiàng)目文件中加入:QT += network?
相關(guān)頭文件:

#include<QTcpServer>//監(jiān)聽(tīng)套接字
#include<QTcpSocket>//建立連接的通信套接字
1
2
在頭文件中,定義套接字:

? ? QTcpServer *tcpServer;//監(jiān)聽(tīng)套接字
? ? QTcpSocket *tcpSocket;//通信套接字
1
2
隨后,在cpp文件中初始化:

? ? //初始化套接字
? ? tcpServer = NULL;
? ? tcpSocket = NULL;
? ? //監(jiān)聽(tīng)套接字,指定父對(duì)象自動(dòng)回收空間
? ? tcpServer = new QTcpServer(this);
? ? //設(shè)定端口
? ? tcpServer->listen(QHostAddress::Any,8888);
1
2
3
4
5
6
7
當(dāng)新連接建立時(shí),監(jiān)聽(tīng)套接字會(huì)自動(dòng)觸發(fā)信號(hào):newConnection ,讀取到數(shù)據(jù)之后,通信套接字會(huì)觸發(fā)信號(hào)readyRead,因此,我們可以通過(guò)信號(hào)槽機(jī)制進(jìn)行操作,這里嵌套了兩個(gè)Qt5的Lambda表達(dá)式:

//新連接建立的信號(hào)槽
connect(tcpServer,&QTcpServer::newConnection,[=]()
? ? {
? ? //取出建立好連接的套接字
? ? ? ? tcpSocket = tcpServer->nextPendingConnection();
? ? //獲取對(duì)方的IP和端口
? ? QString ip = tcpSocket->peerAddress().toString();
? ? qint16 port = tcpSocket->peerPort();
? ? //將信息顯示到UI
? ? QString temp = QString("[%1:%2]:成功連接").arg(ip).arg(port);
? ? ui->textEditRead->setText(temp); ?
? ? ?//連接建立后,讀取到數(shù)據(jù)的信號(hào)槽
? ? connect(tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? [=]()
? ? ? ? ? ? {
? ? ? ? ? ? ?//從通信套接字取出內(nèi)容
? ? ? ? ? ? ?QByteArray array = tcpSocket->readAll();
? ? ? ? ? ? ?//顯示到UI
? ? ? ? ? ? ?ui->textEditRead->append(array);
? ? ? ? ? ? } );
? ? });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
客戶(hù)端的設(shè)置與服務(wù)器類(lèi)似,只不過(guò)少了一個(gè)監(jiān)聽(tīng)套接字:?
頭文件中定義套接字:QTcpSocket * tcpSocket;//通信套接字?
cpp文件初始化套接字:

? ? //初始化套接字
? ? tcpSocket = NULL;
? ? //分配空間,指定父對(duì)象
? ? tcpSocket = new QTcpSocket(this);
1
2
3
4
信號(hào)槽與服務(wù)器類(lèi)似,這里的Lambda表達(dá)式?jīng)]有嵌套:

?//獲取服務(wù)器IP和端口
? ? QString ip = ui->lineEditIP->text();
? ? qint16 port = ui->lineEditPort->text().toInt();
? ? //主動(dòng)連接服務(wù)器
? ? tcpSocket->connectToHost(QHostAddress(ip),port);
?//建立連接的信號(hào)槽
? ? connect(tcpSocket,&QTcpSocket::connected,
? ? ? ? ? ? [=]()
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?ui->textEditRead->setText("恭喜,成功連接服務(wù)器!");
? ? ? ? ? ? }
? ? ? ? ? ? );
? ? //連接建立后收到服務(wù)器數(shù)據(jù)的信號(hào)槽
? ? connect(tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? [=]()
? ? ? ? ? ?{
? ? ? ? ?//獲取對(duì)方發(fā)送的內(nèi)容
? ? ? ? QByteArray array = tcpSocket->readAll();
? ? ? ? //顯示到編輯框
? ? ? ? ui->textEditRead->append(array);//append,添加內(nèi)容
? ? ? ? ? ? }?
//發(fā)送數(shù)據(jù) ?
? ?//獲取編輯框內(nèi)容
? ? QString str = ui->textEditWrite->toPlainText();
? ? ?//發(fā)送數(shù)據(jù)
? ? ?tcpSocket->write( str.toUtf8().data() );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
關(guān)于斷開(kāi)連接:?
1、disconnectFromHost()?
嘗試關(guān)閉套接字。如果有等待寫(xiě)入的掛起數(shù)據(jù),qabstracksocket將進(jìn)入關(guān)閉狀態(tài),并等待所有數(shù)據(jù)寫(xiě)入完畢。最終,它將進(jìn)入未連接狀態(tài)并發(fā)出disconnected()信號(hào)。?
2、?abort()?
中止當(dāng)前連接并重置套接字。與disconnectFromHost ( )不同,此函數(shù)會(huì)立即關(guān)閉套接字,丟棄寫(xiě)入緩沖區(qū)中的所有掛起數(shù)據(jù)。?
3、close()?
關(guān)閉套接字的I / O設(shè)備,斷開(kāi)套接字與主機(jī)的連接,關(guān)閉套接字,并重置名稱(chēng)、地址、端口號(hào)和基礎(chǔ)套接字描述符。

效果如圖,連接建立后服務(wù)器與客戶(hù)端相互發(fā)送數(shù)據(jù):?

Demo下載地址:?
鏈接:https://pan.baidu.com/s/12pGsDS-NlKke7a5SlpBqLQ 密碼:eesc

如果閱讀本篇博客有障礙,可參考網(wǎng)絡(luò)編程基礎(chǔ)知識(shí):?
可以參考https://blog.csdn.net/qq_40194498/article/details/78901089?
https://blog.csdn.net/qq_40194498/article/details/78934426

原文:https://blog.csdn.net/qq_40194498/article/details/79710824?
?

總結(jié)

以上是生活随笔為你收集整理的Qt网络程序:基于TCP的服务器、客户端实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。