日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt网络程序:基于TCP的服务器、客户端实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我們需要設置服務器:?
項目文件中加入:QT += network?
相關頭文件:

#include<QTcpServer>//監聽套接字
#include<QTcpSocket>//建立連接的通信套接字
1
2
在頭文件中,定義套接字:

? ? QTcpServer *tcpServer;//監聽套接字
? ? QTcpSocket *tcpSocket;//通信套接字
1
2
隨后,在cpp文件中初始化:

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

//新連接建立的信號槽
connect(tcpServer,&QTcpServer::newConnection,[=]()
? ? {
? ? //取出建立好連接的套接字
? ? ? ? tcpSocket = tcpServer->nextPendingConnection();
? ? //獲取對方的IP和端口
? ? QString ip = tcpSocket->peerAddress().toString();
? ? qint16 port = tcpSocket->peerPort();
? ? //將信息顯示到UI
? ? QString temp = QString("[%1:%2]:成功連接").arg(ip).arg(port);
? ? ui->textEditRead->setText(temp); ?
? ? ?//連接建立后,讀取到數據的信號槽
? ? connect(tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? [=]()
? ? ? ? ? ? {
? ? ? ? ? ? ?//從通信套接字取出內容
? ? ? ? ? ? ?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
客戶端的設置與服務器類似,只不過少了一個監聽套接字:?
頭文件中定義套接字:QTcpSocket * tcpSocket;//通信套接字?
cpp文件初始化套接字:

? ? //初始化套接字
? ? tcpSocket = NULL;
? ? //分配空間,指定父對象
? ? tcpSocket = new QTcpSocket(this);
1
2
3
4
信號槽與服務器類似,這里的Lambda表達式沒有嵌套:

?//獲取服務器IP和端口
? ? QString ip = ui->lineEditIP->text();
? ? qint16 port = ui->lineEditPort->text().toInt();
? ? //主動連接服務器
? ? tcpSocket->connectToHost(QHostAddress(ip),port);
?//建立連接的信號槽
? ? connect(tcpSocket,&QTcpSocket::connected,
? ? ? ? ? ? [=]()
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?ui->textEditRead->setText("恭喜,成功連接服務器!");
? ? ? ? ? ? }
? ? ? ? ? ? );
? ? //連接建立后收到服務器數據的信號槽
? ? connect(tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? [=]()
? ? ? ? ? ?{
? ? ? ? ?//獲取對方發送的內容
? ? ? ? QByteArray array = tcpSocket->readAll();
? ? ? ? //顯示到編輯框
? ? ? ? ui->textEditRead->append(array);//append,添加內容
? ? ? ? ? ? }?
//發送數據 ?
? ?//獲取編輯框內容
? ? QString str = ui->textEditWrite->toPlainText();
? ? ?//發送數據
? ? ?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
關于斷開連接:?
1、disconnectFromHost()?
嘗試關閉套接字。如果有等待寫入的掛起數據,qabstracksocket將進入關閉狀態,并等待所有數據寫入完畢。最終,它將進入未連接狀態并發出disconnected()信號。?
2、?abort()?
中止當前連接并重置套接字。與disconnectFromHost ( )不同,此函數會立即關閉套接字,丟棄寫入緩沖區中的所有掛起數據。?
3、close()?
關閉套接字的I / O設備,斷開套接字與主機的連接,關閉套接字,并重置名稱、地址、端口號和基礎套接字描述符。

效果如圖,連接建立后服務器與客戶端相互發送數據:?

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

如果閱讀本篇博客有障礙,可參考網絡編程基礎知識:?
可以參考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?
?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。