最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Qt的TCP實(shí)現(xiàn)通信

 更新時(shí)間:2022年08月23日 08:42:45   作者:遇安啊  
這篇文章主要為大家詳細(xì)介紹了基于Qt的TCP實(shí)現(xiàn)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了基于Qt的TCP實(shí)現(xiàn)通信的具體代碼,供大家參考,具體內(nèi)容如下

一、tcp介紹

TCP是面向連接的可靠傳輸?shù)膮f(xié)議,協(xié)議規(guī)定通信的雙方是服務(wù)端和客戶端的兩個(gè)角色:
服務(wù)端:負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)端口,等待客戶端的連接,用連接的socket完成信息的交互;
客戶端:負(fù)責(zé)每次連接的發(fā)起,建立連接后才可以進(jìn)行通信;

二、界面設(shè)計(jì)

服務(wù)器端

客戶端

三、具體程序設(shè)計(jì)

(1)服務(wù)器端設(shè)計(jì)

1、建立一個(gè)工程,工程名為tcpserver,類名為server。在.pro文件中加入如下代碼并保存。

QT ? ? ? += network

2、進(jìn)入server.h,添加類的前置聲明

class QTcpServer;   //QTcpServer類的前置聲明
class QTcpSocket; ? //QTcpSocket類的前置聲明

添加私有對(duì)象指針

QTcpServer *tcpServer; ? ? ? ? ?//添加QTcpServer私有對(duì)象指針
QTcpSocket *socket; ? ? ? ? ? ? //添加QTcpSocket私有對(duì)象指針

添加私有槽聲明

?void tcpServer_connect(); ? ? ? //連接函數(shù)
?void read_data(); ? ? ? ? ? ? ? //讀取從client發(fā)來的信息
?void disconnected(); ? ? ? ? ? ?//斷開連接
?void on_sendButton_clicked(); ? //發(fā)送數(shù)據(jù)函數(shù)

3、轉(zhuǎn)到server.cpp文件中

添加頭文件#include,然后編寫構(gòu)造函數(shù)構(gòu)造函數(shù)

Server::Server(QWidget *parent) : ? ? ? ? ? ?//構(gòu)造函數(shù)
? ? QDialog(parent),
? ? ui(new Ui::Server)
{
? ? ui->setupUi(this);
? ? tcpServer = new QTcpServer(this); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //創(chuàng)建對(duì)象
? ? if(!tcpServer->listen(QHostAddress::LocalHost,6666)) ? ? ? ? ? ? ? ? ? ? ? ? ?//調(diào)用listen監(jiān)聽到來的連接,一旦有客戶端連接到服務(wù)器,就發(fā)射newConnection信號(hào)
? ? {
? ? ? ? qDebug()<<tcpServer->errorString();
? ? ? ? close();
? ? }
? ? ui->sendButton->setEnabled(false); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 設(shè)置按鈕初始值值為false狀態(tài),即不可用
? ? connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//將newConnection信號(hào)與槽函數(shù)連接起來
}

槽函數(shù)

//發(fā)送數(shù)據(jù)槽函數(shù)
void Server::on_sendButton_clicked()
{
? ? socket->write(ui->sendText->toPlainText().toLocal8Bit());? ? ? //通過write函數(shù)發(fā)送數(shù)據(jù)
? ? socket->flush();
? ? ui->sendText->clear();
}

//確認(rèn)連接
void Server::tcpServer_connect()
{
? ? socket=tcpServer->nextPendingConnection();
? ? QObject::connect(socket,&QTcpSocket::readyRead,this,&Server::read_data); ? ?//當(dāng)接收緩沖區(qū)有信號(hào)到來時(shí),產(chǎn)生readyRead信號(hào)
? ? QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//當(dāng)接收到dinconnected信號(hào)時(shí),執(zhí)行disconnected函數(shù)
? ? ui->sendButton->setEnabled(true); ? ? ? ?  //按鈕設(shè)置為有效
? ? ui->label->setText(tr("連接成功!"));
}

//讀取客戶端發(fā)送的數(shù)據(jù)
void Server::read_data()
{
? ? QByteArray buffer=socket->readAll(); ? ? ? ?  ?//讀取的數(shù)據(jù)放入QByteArray對(duì)象中
? ? ui->recText->append(QString::fromLocal8Bit(buffer)); ? ? ??//將數(shù)據(jù)顯示出來
}

void Server::disconnected()
{
? ? ui->sendButton->setEnabled(false); ? ? ? ?//斷開連接后按鈕值設(shè)置為無效
}

(2)客戶端設(shè)計(jì)

1、建立一個(gè)工程,工程名為tcpclient,類名為client。在.pro文件中加入如下代碼并保存。

QT ? ? ? += network

2、進(jìn)入client.h,添加類的前置聲明

class QTcpSocket; ? ? //QTcpSocket類的前置聲明

定義一個(gè)套接字對(duì)象指針

QTcpSocket *tcpSocket;? ? ? ?//定義一個(gè)套接字對(duì)象指針

添加私有槽函數(shù)聲明

?void readData(); ? ? ? ? ? ? ? ? //讀取函數(shù)
?void discon(); ? ? ? ? ? ? ? ? ? //斷開連接
?void on_connectButton_clicked(); //連接按鈕槽函數(shù)
?void on_sendButton_clicked(); ? ?//發(fā)送按鈕槽函數(shù)

3、轉(zhuǎn)到client.cpp,

添加頭文件#include,并編寫構(gòu)造函數(shù)

Client::Client(QWidget *parent) :
? ? QDialog(parent),
? ? ui(new Ui::Client)
{
? ? ui->setupUi(this);
? ? tcpSocket = new QTcpSocket(this);? ? ? ? ? //定義套接字對(duì)象

? ? //關(guān)聯(lián)信號(hào)到自定義的槽上
? ? QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData); ? ? ? ? ?//有接收數(shù)據(jù)時(shí),執(zhí)行讀函數(shù)
? ? QObject::connect(tcpSocket,&QTcpSocket::disconnected,this,&Client::discon);
? ? ui->sendButton->setEnabled(false);
}

槽函數(shù)

void Client::discon()
{
? ? ui->sendButton->setEnabled(false);
? ? ui->connectButton->setText(tr("取消連接"));

}

//點(diǎn)擊連接按鈕,開始創(chuàng)建連接
void Client::on_connectButton_clicked()
{
? ? if(ui->connectButton->text()==tr("連接"))
? ? {
? ? ? ? tcpSocket->abort();
? ? ? ? tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());//連接到指定主機(jī)的端口
? ? ? ? if(!tcpSocket->waitForConnected(30000)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //超時(shí)連接失敗
? ? ? ? {
? ? ? ? ? ? qDebug()<<"Connection failed!";
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? qDebug()<<"Connection successfully!";
? ? ? ? ui->connectButton->setText("取消連接");
? ? ? ? ui->sendButton->setEnabled(true);
? ? }
? ? else
? ? {
? ? ? ? tcpSocket->disconnectFromHost();
? ? ? ? ui->connectButton->setText("連接");
? ? ? ? ui->sendButton->setEnabled(false);
? ? }
}

//點(diǎn)擊發(fā)送數(shù)據(jù)
void Client::on_sendButton_clicked()
{
? ? QString sendData=ui->sendText->toPlainText(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //發(fā)送數(shù)據(jù)為文本框的的內(nèi)容
? ? tcpSocket->write(sendData.toLocal8Bit());
? ? tcpSocket->flush();
? ? ui->sendText->clear();
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ TensorflowLite模型驗(yàn)證的過程詳解

    C++ TensorflowLite模型驗(yàn)證的過程詳解

    這篇文章給大家介紹了C++ TensorflowLite模型驗(yàn)證的過程,測(cè)試代碼,主要是RunInference()和read_file(),詳細(xì)操作過程跟隨小編一起看看吧
    2021-08-08
  • 淺談c++中“::”和“:” 冒號(hào)的意思

    淺談c++中“::”和“:” 冒號(hào)的意思

    這篇文章主要介紹了淺談c++中“::”和“:” 冒號(hào)的意思,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建

    C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建的相關(guān)資料,希望通過本文幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解

    C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解

    這篇文章主要介紹了C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例

    c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例

    這篇文章主要介紹了c/c++獲取系統(tǒng)時(shí)間函數(shù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)

    C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)

    qsort函數(shù)是由C語言提供的標(biāo)準(zhǔn)庫函數(shù), 它的實(shí)現(xiàn)思想是快速排序。這篇文章主要介紹了C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下
    2022-10-10
  • C++中std::invalid_argument報(bào)錯(cuò)解決

    C++中std::invalid_argument報(bào)錯(cuò)解決

    在C++編程中,std::invalid_argument是一個(gè)常見的異常,用于指示函數(shù)參數(shù)無效,文章詳細(xì)解析了這一異常的產(chǎn)生原因,并提供了多種解決策略,感興趣的可以了解一下
    2024-09-09
  • C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出

    C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出

    上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個(gè)問題,快速排序和歸并排序我們都是用遞歸來實(shí)現(xiàn)的,可能有小伙伴會(huì)問,如果說數(shù)據(jù)量很多話,棧區(qū)空間會(huì)不會(huì)不夠用呢?這期我們就來解決使用遞歸實(shí)現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q
    2022-04-04
  • C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配

    C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配

    C++ 不允許變量重名,但是允許多個(gè)函數(shù)取相同的名字,只要參數(shù)表不同即可,這叫作函數(shù)的重載,下面這篇文章主要給大家介紹了關(guān)于C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配的相關(guān)資料,需要的朋友可以參考下
    2019-01-01
  • C語言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例

    C語言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了C語言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

通山县| 白玉县| 浠水县| 冷水江市| 马龙县| 南郑县| 肥西县| 和平县| 兴业县| 海伦市| 克山县| 承德市| 彭水| 嵊州市| 贡嘎县| 奈曼旗| 阿拉善盟| 深水埗区| 烟台市| 柳河县| 新绛县| 招远市| 二连浩特市| 高清| 兰州市| 屏南县| 买车| 昌黎县| 龙海市| 泸水县| 积石山| 普宁市| 通城县| 德保县| 泾阳县| 靖宇县| 永吉县| 舟山市| 东海县| 邯郸市| 和顺县|