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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

qt TCP 网络编程

發布時間:2023/12/9 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt TCP 网络编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

qt 網絡

介紹 待補
QT網絡編程——TCP服務器和客戶端通信

Qt網絡編程(1):QTcpSocket和QTcpServer的基本使用
介紹得非常清楚

客戶端

有兩種方式:

  • 繼承QObject,QTcpSocket當作成員函數
  • 繼承QTcpSocket
  • 先說第一種

    QTcpSocket 成員變量

    首先 QTcpSocket 最基本的功能
    1、創建QTcpSocket對象,并用connectToHost()函數通過IP和端口號連接服務器。

    tcpSocket = new QTcpSocket(this); tcpSocket->connectToHost(ip,port); //根據IP地址和端口號連接服務器

    2、客戶端成功連接上服務器,系統會產生connected信號。(所以需要將信號和槽函數進行綁定)

    connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot())); //客戶端連接服務器成功后會產生connected信號

    3、客戶端收到服務器發送來的數據,會產生readyRead信號,在connected信號對應的槽函數中,將readyRead信號和對應的槽函數進行綁定。

    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot())); //和服務器連接成功后,就需要就收服務器發送過來的數據了,

    4、通過套接字對象讀取服務器發來的數據。(用readall()等函數)

    tcpSocket->readAll(); //從套接字中讀取服務器發來的數據

    5、通過套接字向服務器發送數據。(用write()函數)

    tcpSocket->write(text); //向服務器發送數據

    6、服務器斷開連接,會發送disconnected信號

    connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));

    這里要做的稍微復雜一點
    頭文件

    class Client : public QObject {Q_OBJECTpublic:Client();~Client ();void Connect(QString strServerIP, int nServerPort);//連接服務器void ReConnect();//重新連接服務器void Disconnect(); private:QMutex m_lock;QTcpSocket* m_pTcpSocket;QTimer m_timerConnect;QTimer m_timerReconnect;QString m_strServerIP ;QQueue<QString> m_QueueMess;//要發送的信息int m_nServerPort; }

    連接服務器

    要保持一直連接的狀態
    要考慮到:連不上自動重連;掉線自動重連的功能
    這里用定時器實現以上功能

    QTimer m_timerConnect;

    連接服務器 Connect時開一個定時器 m_timerConnect。

  • 如果連上了,就關閉定時器
  • 如果到時間 ,就嘗試重新連接
  • 在構造函數里:

    • 定時器槽函數
    • QTcpSocket 連接上的槽函數
    • QTcpSocket 斷開的槽函數
    m_timerConnect.setInterval(1000);connect(&m_timerConnect, SIGNAL(timeout()), this, SLOT(OnTimerReconncet()));m_pTcpSocket = new QTcpSocket(this);connect(m_pTcpSocket, SIGNAL(connected()), this, SLOT(OnConnected()));connect(m_pTcpSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));

    連服務器:

    先關閉套接字
    abort 調用了 close, close 調用了 disconnectFromHost。 abort 立即關閉套接字,并丟棄寫緩沖區中的所有待處理數據。close 關閉套接字的 IO,以及套接字的連接。

    再連接服務器connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);

    開啟定時器

    void Client::Connect(QString strServerIP, int nServerPort) {m_strServerIP = strServerIP;m_nServerPort = nServerPort;m_bCloseConnect = false;// m_pTcpSocket->abort();m_pTcpSocket->connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);m_timerConnect.start(3000); }
    如果服務器連上了

    關閉定時器,狀態設置為已連接

    //connect(m_pTcpSocket, SIGNAL(connected()), this, SLOT(OnConnected())); void Client::OnConnected() {m_bConnected = true;m_timerConnect.stop(); }
    如果沒連上
    //到時間沒有連上,觸發定時器connect(&m_timerConnect, SIGNAL(timeout()), this, SLOT(OnTimerReconncet())); void Client::OnTimerReconncet() {m_pTcpSocket->abort();m_pTcpSocket->connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite); }
    如果服務器斷開了

    開啟定時器

    void CTcpClient::OnDisconnected() {m_bConnected = false;m_timerReconnect.start(); }

    發送的數據

    向服務器發送消息調用

    qint64 write(const char *data, qint64 len);qint64 write(const char *data);
  • 直接發送數據:
    bool SendData(QString strData);
    {
    AddDataToSendQueue(strData);
    }
  • AddDataToSendQueue
    m_lock.lock();
    m_quueSendData.enqueue(strData);
    m_lock.unlock();

    emit sendData();
  • 阻塞式發送
  • 發送一個數據,開啟時間循環。等待服務器返回消息。再返回結果

    接收數據

    總結

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

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