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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Qt中的TCP客户端编程

發布時間:2025/4/5 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中的TCP客户端编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 Qt中的TCP客戶端編程
      • 1.1 TCP客戶端編程介紹
      • 1.2 QTcpSocket的同步編程
      • 1.3 QTcpSocket的異步編程

1 Qt中的TCP客戶端編程

1.1 TCP客戶端編程介紹

Qt中的客戶端編程:

Qt中的TCP客戶端編程:

  • 對于Qt編程而言,網絡只是數據傳輸的通道。
  • Qt提供了QTcpSocket類(封裝了TCP協議細節)。
  • 將QTcpSocket的對象當作黑盒使用,進行數據收發。

QTcpSocket的使用方式:

  • 連接服務端主機(connectToHost)。
  • 發送數據/接收數據(write()/read())。
  • 關閉連接(close())。
  • QTcpSocket的注意事項:

    • 默認情況下,QTcpSocket使用異步編程的方式:
      • 操作完成后立即返回。
      • 通過發送信號的方式返回操作結果。
    • QTcpSocket提供了輔助函數,可完成同步編程的方式:
      • waitForConnected()/waitForDisconnected()
      • waitForBytesWritten()/waitForReadyRead()

    **這種異步編程的實現原理是什么?是單獨開了個線程嗎?
    **

    發送緩沖區和接收緩沖區的概念:

    發送緩沖區:

    • 數據先進入發送緩沖區,之后由操作系統送往遠端主機。
    • flush()強制發送緩沖區中的數據立即被送走。

    接收緩沖區:

    • 遠端數據被操作系統接收后放入接收緩沖區。
    • bytesAvailable()獲取接收緩沖區中數據的字節數。

    1.2 QTcpSocket的同步編程

    同步編程的步驟如下:

    #include <QCoreApplication> #include <QTcpSocket> #include <QDebug> #include <QThread>void SyncClientDemo() {QTcpSocket client;char buf[256] = {0};client.connectToHost("127.0.0.1", 8080);qDebug() << "Connected:" << client.waitForConnected();qDebug() << "Send Bytes:" << client.write("D.T.Software");qDebug() << "Send Status:" << client.waitForBytesWritten();qDebug() << "Data Available:" << client.waitForReadyRead();qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf)-1);qDebug() << "Received Data:" << buf;client.close();// client.waitForDisconnected(); }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);SyncClientDemo();return a.exec(); }

    1.3 QTcpSocket的異步編程

    QTcpSocket的異步編程:

    • QTcpSocket對象通過發送信號的方式返回操作結果。
    • 可以在程序中將對應信號連接到槽函數,獲取結果。
    • 在GUI應用程序中通常使用QTcpSocket的異步方式。

    QTcpSocket中的關鍵信號:

    • connected():成功連接遠端主機。
    • disconnected():遠端主機斷開連接。
    • readyRead():遠端數據到達本機。
    • bytesWritten(qint64):數據成功發送至系統(OS)。

    實現代碼如下:

    ClientDemo.h:

    #ifndef CLIENTDEMO_H #define CLIENTDEMO_H#include <QObject> #include <QTcpSocket>class ClientDemo : public QObject {Q_OBJECTQTcpSocket m_client; protected slots:void onConnected();void onDisconnected();void onDataReady();void onBytesWritten(qint64 bytes);public:ClientDemo(QObject* parent = NULL);void connectTo(QString ip, int port);qint64 send(const char* data, int len);qint64 available();void close(); };#endif // CLIENTDEMO_H

    ClientDemo.cpp:

    #include "ClientDemo.h" #include <QHostAddress> #include <QDebug>ClientDemo::ClientDemo(QObject* parent) : QObject(parent) {connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()));connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64))); }void ClientDemo::onConnected() {qDebug() << "onConnected";qDebug() << "Local Address:" << m_client.localAddress();qDebug() << "Local Port:" << m_client.localPort(); }void ClientDemo::onDisconnected() {qDebug() << "onDisconnected"; }void ClientDemo::onDataReady() {char buf[256] = {0};qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf)-1);qDebug() << "Data:" << buf; }void ClientDemo::onBytesWritten(qint64 bytes) {qDebug() << "onBytesWritten:" << bytes; }void ClientDemo::connectTo(QString ip, int port) {m_client.connectToHost(ip, port); }qint64 ClientDemo::send(const char* data, int len) {return m_client.write(data, len); }qint64 ClientDemo::available() {return m_client.bytesAvailable(); }void ClientDemo::close() {m_client.close(); }

    main.cpp:

    #include <QCoreApplication> #include <QTcpSocket> #include <QDebug> #include <QThread> #include "ClientDemo.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);ClientDemo demo;char buf[] = "Hello!";demo.connectTo("127.0.0.1", 8080);demo.send(buf, sizeof(buf)-1);return a.exec(); }

    考慮一下:如何主動斷開連接呢?測試發現在析構函數中斷開連接是不成功的!


    參考資料:

  • QT實驗分析教程
  • 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Qt中的TCP客户端编程的全部內容,希望文章能夠幫你解決所遇到的問題。

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