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的服务器、客户端实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SendMessage、PostMess
- 下一篇: 裁员感悟