首先我們需要設定伺服器:
項目檔案中加入:
QT += network
相關頭檔案:
#include<QTcpServer>//監聽套接字
#include<QTcpSocket>//建立連接配接的通信套接字
在頭檔案中,定義套接字:
QTcpServer *tcpServer;//監聽套接字
QTcpSocket *tcpSocket;//通信套接字
随後,在cpp檔案中初始化:
//初始化套接字
tcpServer = NULL;
tcpSocket = NULL;
//監聽套接字,指定父對象自動回收空間
tcpServer = new QTcpServer(this);
//設定端口
tcpServer->listen(QHostAddress::Any,);
當新連接配接建立時,監聽套接字會自動觸發信号:
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);
} );
});
用戶端的設定與伺服器類似,隻不過少了一個監聽套接字:
頭檔案中定義套接字:
QTcpSocket * tcpSocket;//通信套接字
cpp檔案初始化套接字:
//初始化套接字
tcpSocket = NULL;
//配置設定空間,指定父對象
tcpSocket = new QTcpSocket(this);
信号槽與伺服器類似,這裡的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、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