QT之TCP通訊---服務端
阿新 • • 發佈:2018-12-12
專案需求:使用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. 實現傳送功能
//當傳送按鈕被點選的時候,傳送內容到客戶端
void ServerWidget::on_buttonSend_clicked()
{
if(tcpSocket == NULL)
{
return;
}
//A. 獲取文字框的內容
QString str = ui->textEditSend->toPlainText();
//B. 將資料寫入通訊套接字
tcpSocket->write(str.toUtf8().data());
}
9. 實現斷開連線功能
//當點選關閉的時候,斷開與客戶端的連線
void ServerWidget::on_buttonClose_clicked()
{
if(tcpSocket == NULL)
{
return;
}
tcpSocket->disconnectFromHost();
tcpSocket->close();
tcpSocket = NULL;
ui->textEditReceive->append("與客戶端連線已斷開");
}
下一篇實現客戶端。