Qt中的TCP客户端编程
生活随笔
收集整理的這篇文章主要介紹了
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的使用方式:
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_HClientDemo.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中的TCP客户端编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用堆实现优先级队列
- 下一篇: Qt中TCP服务端编程