Qt TCP 通讯简单案例
TCP
簡介:
-
TCP 是一個面向數據流和連接的可靠傳輸協議。
QTcpSocket類為TCP提供了一個接口,繼承自QAbstractSocket。
可以使用QTcpSocket來實現POP3\SMTP\NNTP 等標準的網絡協議。
與UdpSocket 傳輸的數據報不同,QTcpSocket傳輸的是連續的數據流,尤其適合于連續的數據傳輸。
連接:
1、在任何數據傳輸之前,必須建立一個TCP連接到遠程的主機和端口上。一旦建立連接,peer(對使用TCP協議連接在一起的主機的通稱)的IP地址和端口 可以用
QTcpSocket::peerAddress()QTcpSocket::peerPort()
來獲取。
2、在任何時間peer都可以關閉連接,傳輸會立即終止。
讀寫:
寫:QTcpSocket::write()
讀:QTcpSocket::read()
是否有數據可讀: QTcpSocket::bytesAvailable()
通信:
使用QTcpServer類:
-
設置服務器:QTcpServer::listen()
-
關聯信號:QTcpServer::newConnection()
-
接收連接:QTcpServer :: nextPendingConection()
-
在同步模式下, 要注意阻塞的問題。
服務端案例:
1、建立Qt gui 工程。項目名稱tcpServer, 類名:Server
2、tcpServer.pro 文件中添加“QT+=network”
3、server.ui 中添加控件。
4、編寫server.h
添加類的前置聲明:class QTcpServer;
添加私有對象定義: QTcpServer *tcpServer;
添加私有槽聲明: void sendMessage();
5、編寫server.cpp
添加頭文件 #include <QtNetwork>改寫構造函數:tcpServer = new QTcpServer(this);
// 使用了IPv4的本地主機地址,等價于QHostAddress("127.0.0.1") if (!tcpServer->listen(QHostAddress::LocalHost, 6666)) {qDebug() << tcpServer->errorString();close(); } connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()));添加發送信息槽的實現代碼:
void Server::sendMessage(){
// 用于暫存我們要發送的數據
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
// 設置數據流的版本,客戶端和服務器端使用的版本要相同
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << tr(“hello TCP!!!”);
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
// 獲取已經建立的連接的套接字
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
// 發送數據成功后,顯示提示
ui->label->setText(“send message successful!!!”);
}
客戶端案例:
1、建立Qt gui 工程。項目名稱tcpClient, 類名:Client2、tcpClient.pro 文件中添加“QT+=network”3、client.ui 中添加控件。4、編寫client.h 添加頭文件: #include
添加類的前置聲明:class QTcpSocket;
添加私有對象定義: QTcpSocket *tcpSocket;
添加私有槽聲明:
void newConnect();
void readMessage();
void displayError(QAbstractSocket::SocketError
void on_connectButton_clicked();
5、編寫client.cpp
添加頭文件 #include
信號槽程序:
void Client::newConnect() { // 初始化數據大小信息為0 blockSize = 0; // 取消已有的連接 tcpSocket->abort(); tcpSocket->connectToHost(ui->hostLineEdit->text(), ui->portLineEdit->text().toInt()); if(!socket->waitForConnected(30000)) { qDebug()<<tr("連接服務器失敗,請重新操作!"); } else { qDebug()<<tr("連接服務器成功!"); QMessageBox::warning(this,tr("連接提示"),tr("連接服務器成功!"),QMessageBox::Yes,QMessageBox::No); } } void Client::readMessage() {QDataStream in(tcpSocket);// 設置數據流版本,這里要和服務器端相同in.setVersion(QDataStream::Qt_4_6);// 如果是剛開始接收數據if (blockSize == 0) {//判斷接收的數據是否大于兩字節,也就是文件的大小信息所占的空間//如果是則保存到blockSize變量中,否則直接返回,繼續接收數據if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;in >> blockSize;}// 如果沒有得到全部的數據,則返回,繼續接收數據if(tcpSocket->bytesAvailable() < blockSize) return;// 將接收到的數據存放到變量中in >> message;// 顯示接收到的數據qDebug() << message;ui->messageLabel->setText(message); }客戶端界面:
連接地址:資源Qt5 Socket 簡單通訊實例,本人在做上位機開發的時候,簡單做的一個案例,可實現客戶端和服務端的收發。 案例簡單實用,供參考。
總結
以上是生活随笔為你收集整理的Qt TCP 通讯简单案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eigen求解数学问题(二)
- 下一篇: ACM竞赛学习整理开篇之01背包问题