日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt TCP 通讯简单案例

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;

QString message; // 用來存放數據的大小信息 quint16 blockSize;

添加私有槽聲明:
void newConnect();
void readMessage();
void displayError(QAbstractSocket::SocketError
void on_connectButton_clicked();

5、編寫client.cpp
添加頭文件 #include

改寫構造函數:tcpSocket = new QTcpSocket(this); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage())); connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));

信號槽程序:

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 通讯简单案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。