Qt中的TCP客户端编程
生活随笔
收集整理的這篇文章主要介紹了
Qt中的TCP客户端编程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 Qt中的TCP客戶端編程
- 1.1 TCP客戶端編程介紹
- 1.2 QTcpSocket的同步編程
- 1.3 QTcpSocket的異步編程
1 Qt中的TCP客戶端編程
1.1 TCP客戶端編程介紹
Qt中的客戶端編程:
Qt中的TCP客戶端編程:
- 對于Qt編程而言,網(wǎng)絡(luò)只是數(shù)據(jù)傳輸?shù)耐ǖ馈?/li>
- Qt提供了QTcpSocket類(封裝了TCP協(xié)議細(xì)節(jié))。
- 將QTcpSocket的對象當(dāng)作黑盒使用,進(jìn)行數(shù)據(jù)收發(fā)。
QTcpSocket的使用方式:
QTcpSocket的注意事項:
- 默認(rèn)情況下,QTcpSocket使用異步編程的方式:
- 操作完成后立即返回。
- 通過發(fā)送信號的方式返回操作結(jié)果。
- QTcpSocket提供了輔助函數(shù),可完成同步編程的方式:
- waitForConnected()/waitForDisconnected()
- waitForBytesWritten()/waitForReadyRead()
**這種異步編程的實(shí)現(xiàn)原理是什么?是單獨(dú)開了個線程嗎?
**
發(fā)送緩沖區(qū)和接收緩沖區(qū)的概念:
發(fā)送緩沖區(qū):
- 數(shù)據(jù)先進(jìn)入發(fā)送緩沖區(qū),之后由操作系統(tǒng)送往遠(yuǎn)端主機(jī)。
- flush()強(qiáng)制發(fā)送緩沖區(qū)中的數(shù)據(jù)立即被送走。
接收緩沖區(qū):
- 遠(yuǎn)端數(shù)據(jù)被操作系統(tǒng)接收后放入接收緩沖區(qū)。
- bytesAvailable()獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。
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對象通過發(fā)送信號的方式返回操作結(jié)果。
- 可以在程序中將對應(yīng)信號連接到槽函數(shù),獲取結(jié)果。
- 在GUI應(yīng)用程序中通常使用QTcpSocket的異步方式。
QTcpSocket中的關(guān)鍵信號:
- connected():成功連接遠(yuǎn)端主機(jī)。
- disconnected():遠(yuǎn)端主機(jī)斷開連接。
- readyRead():遠(yuǎn)端數(shù)據(jù)到達(dá)本機(jī)。
- bytesWritten(qint64):數(shù)據(jù)成功發(fā)送至系統(tǒng)(OS)。
實(shí)現(xiàn)代碼如下:
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(); }考慮一下:如何主動斷開連接呢?測試發(fā)現(xiàn)在析構(gòu)函數(shù)中斷開連接是不成功的!
參考資料:
總結(jié)
以上是生活随笔為你收集整理的Qt中的TCP客户端编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用堆实现优先级队列
- 下一篇: Qt中TCP服务端编程