亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt實現(xiàn)TCP網(wǎng)絡(luò)編程

 更新時間:2022年08月19日 09:49:39   作者:一滴涌入大海的雨滴  
這篇文章主要為大家詳細介紹了Qt實現(xiàn)TCP網(wǎng)絡(luò)編程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Qt實現(xiàn)TCP網(wǎng)絡(luò)編程的具體代碼,供大家參考,具體內(nèi)容如下

1.Qt中的TCP客戶端編程

Qt中的TCP客戶端編程:

對于Qt編程而言,網(wǎng)絡(luò)只是數(shù)據(jù)傳輸?shù)耐ǖ?/strong>
Qt提供了QTcpSocket類(封裝了TCP協(xié)議細節(jié))
將QTcpSocket的對象當做黑盒使用,進行數(shù)據(jù)收發(fā)

QTcpSocket的使用方式:

1.連接服務(wù)端主機(connectToHost())
2.發(fā)送數(shù)據(jù)/接受數(shù)據(jù)(write()/read())
3.關(guān)閉連接(close())

QTcpSocket的注意事項:

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

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("CKY");
? ? qDebug() << "Send Status:" << client.waitForBytesWritten();
? ? qDebug() << "Data Avilable:" << client.waitForReadyRead();
? ? qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf));
? ? qDebug() << "Received Data:" << buf;

? ? QThread::sleep(5000);

? ? client.close();

? ? client.waitForDisconnected();

}

int main(int argc, char *argv[])
{
? ? QCoreApplication a(argc, argv);

? ? SyncClientDemo();

? ? return a.exec();
}

QTcpSocket的異步編程:

QTcpSocket對象通過發(fā)送信號的方式返回操作結(jié)果
可以在程序中將對應(yīng)的信號連接到槽函數(shù),獲取結(jié)果
GUI應(yīng)用程序中通常使用QTcpSocket的異步方式

QTcpSocket中的關(guān)鍵信號:

connected():成功連接遠端主機
disconnected():遠端主機斷開連接
readyRead():遠程數(shù)據(jù)到達本機
bytesWritten(qint64):數(shù)據(jù)成功發(fā)送至系統(tǒng)(OS)

編程實驗:QTcpSocket異步編程

#include "clientdemo.h"
#include <QDebug>
#include <QHostAddress>

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() << "Loacl Port:" << m_client.localPort();
}
void ClientDemo::onDisconnected()
{
? ? qDebug() << "onDiecennected()";
}
void ClientDemo::onDataReady()
{
? ? char buf[256] = {0};

? ? qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf));
? ? 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();
}

1.Qt中的TCP服務(wù)端編程

網(wǎng)絡(luò)中的服務(wù)端:
服務(wù)端是為客戶端服務(wù)的,服務(wù)的內(nèi)容諸如向客戶端提供資源,保存客戶端數(shù)據(jù),為客戶端提供功能接口,等
Client/Server軟件架構(gòu)簡介

特點;
服務(wù)端被動接受連接(服務(wù)端無法主動連接客戶端)
服務(wù)端必須公開網(wǎng)絡(luò)地址(容易受到攻擊)
在職責上:
客戶端傾向于處理用于交互及體驗(GUI)
服務(wù)端傾向于用戶數(shù)據(jù)的組織和存儲(數(shù)據(jù)處理)

B/S網(wǎng)絡(luò)結(jié)構(gòu)是什么?
Browser/Server軟件架構(gòu)簡介
B/S是一種特殊的C/S網(wǎng)絡(luò)架構(gòu)
B/S中的客戶端統(tǒng)一使用瀏覽器(Browser)
B/S中的客戶端GUI通常采用HTML進行開發(fā)
B/S中的客戶端與服務(wù)端通常采用http協(xié)議進行通信

Qt中的TCP服務(wù)端編程:

Qt提供了QTcpServer類
將QTcpServer的對象當做黑盒使用,進行連接監(jiān)聽
每一個連接生成一個QTcpSocket對象進行通信

QTcpServer的使用方式:

監(jiān)聽本機地址的端口(listen())
通過信號通知客戶端連接(newConnection())
獲取QTcpSocket通信對象(nextPendingConnection())
停止監(jiān)聽(close())

QTcpServer的注意事項:

用于處理客戶端連接,不進行具體通信
監(jiān)聽的端口只用于響應(yīng)連接請求
監(jiān)聽到連接后,生成QTcpSocket對象與客戶端通信

Client/Server交互流程:

編程實驗:QServerSocket編程

#include "serverdemo.h"
#include "QHostAddress"
#include <QDebug>
#include <QTcpServer>
#include <QObjectList>

ServerDemo::ServerDemo(QObject* parent) : QObject(parent)
{
? ? connect(&m_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

void ServerDemo::onNewConnection()
{
? ? qDebug() << "onNewConnection";
? ? QTcpSocket* tcp = m_server.nextPendingConnection();
? ? connect(tcp, SIGNAL(connected()), this, SLOT(onConnected()));
? ? connect(tcp, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
? ? connect(tcp, SIGNAL(readyRead()), this, SLOT(onDataReady()));
? ? connect(tcp, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}

bool ServerDemo::start(int port)
{
? ? bool ret = true;

? ? if(!m_server.isListening())
? ? {
? ? ? ? ret = m_server.listen(QHostAddress("127.0.0.1", port));
? ? }

? ? return ret;
}

void ServerDemo::stop()
{
? ? if(m_server.isListening())
? ? {
? ? ? ? m_server.close();
? ? }
}

void ServerDemo::onConnected()
{
? ? QTcpServer* tcp = dynamic_cast<QTcpServer*>(sender());

? ? if(tcp != NULL)
? ? {
? ? ? ? qDebug() << "onConnected()";
? ? ? ? qDebug() << "Local Address:" << tcp->localAddress();
? ? ? ? qDebug() << "Loacl Port:" << tcp->localPort();
? ? }

}
void ServerDemo::onDisconnected()
{
? ? qDebug() << "onDiecennected()";
}
void ServerDemo::onDataReady()
{
? ? QTcpServer* tcp = dynamic_cast<QTcpServer*>(sender());
? ? char buf[256] = {0};

? ? if(tcp != NULL)
? ? {
? ? ? ? qDebug() << "onDataReady:" << tcp->read(buf, sizeof(buf));
? ? ? ? qDebug() << "Data:" << buf;
? ? }
}
void ServerDemo::onBytesWritten(qint64 bytes)
{
? ? qDebug() << "onBytesWritten" << bytes;
}

ServerDemo::~ServerDemo()
{
? ? const QObjectList& list = m_server.children();
? ? for(int i = 0; i < list.length(), i++)
? ? {
? ? ? ? QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(list[i]);
? ? ? ? if(tcp != NULL)
? ? ? ? {
? ? ? ? ? ? tcp->close();
? ? ? ? }
? ? }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語言實現(xiàn)向上取整計算方法

    c語言實現(xiàn)向上取整計算方法

    這篇文章主要介紹了c語言實現(xiàn)向上取整計算方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 用C語言進行最基本的socket編程

    用C語言進行最基本的socket編程

    這篇文章主要介紹了C語言下socket編程的基本知識講解,包括最基本的客戶端發(fā)送及服務(wù)器端接受數(shù)據(jù)的實現(xiàn),需要的朋友可以參考下
    2015-11-11
  • C語言函數(shù)聲明以及函數(shù)原型超詳細講解示例

    C語言函數(shù)聲明以及函數(shù)原型超詳細講解示例

    這篇文章主要介紹了C語言函數(shù)聲明以及函數(shù)原型超詳細講解,C語言代碼由上到下依次執(zhí)行,原則上函數(shù)定義要出現(xiàn)在函數(shù)調(diào)用之前,否則就會報錯。但在實際開發(fā)中,經(jīng)常會在函數(shù)定義之前使用它們,這個時候就需要提前聲明
    2023-02-02
  • C++調(diào)用C函數(shù)實例詳解

    C++調(diào)用C函數(shù)實例詳解

    這篇文章主要介紹了C++調(diào)用C函數(shù)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++ accumulate函數(shù)詳細介紹和具體案例

    C++ accumulate函數(shù)詳細介紹和具體案例

    這篇文章主要介紹了C++ accumulate函數(shù)詳細介紹和具體案例,accumulate是numeric庫中的一個函數(shù),主要用來對指定范圍內(nèi)元素求和,但也自行指定一些其他操作,如范圍內(nèi)所有元素相乘、相除等
    2022-08-08
  • C++ Boost Random隨機函數(shù)詳解

    C++ Boost Random隨機函數(shù)詳解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++字符串和數(shù)字的去重操作和鞍點的尋找

    C++字符串和數(shù)字的去重操作和鞍點的尋找

    大家好,本篇文章主要講的是C++字符串和數(shù)字的去重操作和鞍點的尋找,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++進程共享數(shù)據(jù)封裝成類實例

    C++進程共享數(shù)據(jù)封裝成類實例

    這篇文章主要介紹了C++進程共享數(shù)據(jù)封裝成類的方法,以實例形式講述了其封裝代碼與具體用法,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • VC++6.0實現(xiàn)直線掃描轉(zhuǎn)換的圖文教程

    VC++6.0實現(xiàn)直線掃描轉(zhuǎn)換的圖文教程

    這篇文章主要給大家介紹了關(guān)于VC++6.0實現(xiàn)直線掃描轉(zhuǎn)換的相關(guān)資料,文中通過圖文將實現(xiàn)的步驟一步步介紹的非常詳細,對大家學習或者使用VC++6.0具有一定的參考學習價值,需要的朋友可以參考下
    2023-01-01
  • C語言中的指針 初階

    C語言中的指針 初階

    這篇文章主要介紹的是關(guān)于初級階段學習C語言中指針的一些內(nèi)容,那就是指針是什么?簡單的說,就是通過它能找到以它為地址的內(nèi)存單元。下面文章我們就來詳細介紹該內(nèi)容,需要的朋友可以參考一下
    2021-10-10

最新評論