項目需求:使用QT的TCP實現客戶端與服務端的通信,界面如下
寫在開頭:幾個重要的方法與信號
//監聽方法,監聽本機所有IP的9999端口
tcpServer->listen(QHostAddress::Any, 9999);
//當新連接建立時觸發該信號
&QTcpServer::newConnection
//A. 取出tcpSocket套接字
tcpSocket = tcpServer->nextPendingConnection();
//B. 取出套接字中的IP信息
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();
//收到對方發來的數據的時候觸發該信號
&QTcpSocket::readyRead
//將數據寫入通信套接字
tcpSocket->write(str.toUtf8().data());
//斷開與客戶端的連接
tcpSocket->disconnectFromHost();
tcpSocket->close();
服務端的實現
1. 引用網絡模塊到QT中( .pro文件)
QT += network #1. 引用網絡模塊
2. 引用套接字頭文件(server.h)
//2. 引用頭文件
#include <QTcpServer> //監聽套接字
#include <QTcpSocket> //通信套接字
#include <QHostAddress>
3. 創建套接字對象(server.h)
private:
Ui::ServerWidget *ui;
//3. 創建對象
QTcpServer *tcpServer; //監聽套接字
QTcpSocket *tcpSocket; //通信套接字
4. 給對象分配空間(server.cpp)
//4. 給對象分配空間
tcpServer = new QTcpServer(this); //監聽套接字
5. 引用Lamda表達式模塊(.pro)
CONFIG += C++11 #5. 需要使用Lamda表達式
6. 監聽端口(server.cpp)
//6. 服務端監聽本機的所有IP中的9999端口
tcpServer->listen(QHostAddress::Any, 9999);
7. 取出套接字中的信息(server.cpp)
//7. 取出tcpSocket中的信息
connect(tcpServer, &QTcpServer::newConnection,
[=]()
{
//A. 取出tcpSocket套接字
tcpSocket = tcpServer->nextPendingConnection();
//B. 取出套接字中的IP信息
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();
//C. 拼接顯示信息
QString temp = QString("[%1:%2]:Connect Success!").arg(ip).arg(port);
ui->textEditReceive->setText(temp);
//D. 接受數據
connect(tcpSocket, &QTcpSocket::readyRead,
[=]()
{
//讀取通信套接字中的所有數據
QByteArray array = tcpSocket->readAll();
//顯示到UI中
ui->textEditReceive->append(array);
}
);
}
);
8. 實現發送功能(server.cpp)
//當發送按鈕被點擊的時候,發送內容到客戶端
void ServerWidget::on_buttonSend_clicked()
{
if(tcpSocket == NULL)
{
return;
}
//A. 獲取文本框的內容
QString str = ui->textEditSend->toPlainText();
//B. 將數據寫入通信套接字
tcpSocket->write(str.toUtf8().data());
}
9. 實現斷開連接功能(server.cpp)
//當點擊關閉的時候,斷開與客戶端的連接
void ServerWidget::on_buttonClose_clicked()
{
if(tcpSocket == NULL)
{
return;
}
tcpSocket->disconnectFromHost();
tcpSocket->close();
tcpSocket = NULL;
ui->textEditReceive->append("與客戶端連接已斷開");
}
下一篇實現客戶端。
本文原創,轉載請註明出處。