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

基于QT制作一個TCPServer與TCPClient的通信

 更新時間:2023年12月26日 08:42:13   作者:澄澈i  
這篇文章主要為大家詳細(xì)介紹了如何基于QT制作一個TCPServer與TCPClient的通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

之前項目上用到了TCP通信,作為TCP的服務(wù)端上位機(jī)與下位機(jī)進(jìn)行控制信號傳輸。

這篇博客就對QT中使用TCP通信理一個簡單的demo,做一個簡單的TCP服務(wù)端和客戶端的通信。

因為時間有限,這里就闡述一下基本原理和代碼實現(xiàn),具體的demo參考的是《QT5.9C++開發(fā)指南》

具體效果圖如下

1. TCP通信原理和流程闡述

1.1 TCP 通信原理簡述

TCP通信主要是三次握手和四次揮手,前者是建立連接,后者是斷開連接。

上圖是三次握手的一個基本流程圖:

首先客戶機(jī)向服務(wù)器申請同步,即向服務(wù)器申請連接。

服務(wù)器接收到請求,返回一個確認(rèn)幀,告訴客戶機(jī)已經(jīng)收到你的請求,同意連接。

客戶機(jī)收到同意請求信息之后,還要告訴服務(wù)器它已經(jīng)收到服務(wù)器的確認(rèn)請求,接下來可以傳輸數(shù)據(jù)。

上面是一個簡單的TCP建立連接的闡述,那么回歸到服務(wù)器端。在QT中,TCP服務(wù)器端使用QTcpServer用于端口監(jiān)聽和建立服務(wù)器,服務(wù)器和客戶端之間在建立連接后,通信使用QTcpSocket,套接字Socket進(jìn)行。

1.2 TCP服務(wù)端建立與通信流程

在QT中,使用QTcpServer::listen()函數(shù)開始服務(wù)器端監(jiān)聽,這里可以指定監(jiān)聽的IP地址和端口。這個表示服務(wù)器的IP和端口,監(jiān)聽向這個IP和端口發(fā)起請求的客戶端。

當(dāng)有新的客戶端接入時,QTcpServer內(nèi)部的incomingConnection()函數(shù)會創(chuàng)建一個與客戶端連接的QTcpSocket對象,接著發(fā)射信號newConnection()。在newConnection()信號的槽函數(shù)中,可以用nextPendingConnection()接收客戶端的連接,最后使用QTcpSocket與客戶端通信。

1.3 TCP客戶端通信流程

TCP客戶端使用QTcpSocket與TCP服務(wù)器建立連接并通信。

客戶端的QTcpSocket 實例首先通過 connectToHost()嘗試連接到服務(wù)器,需要指定服務(wù)器的IP 地址和端口。

connectToHost()是異步方式連接服務(wù)器,不會阻塞程序運行,連接后發(fā)射 connected()信號。

如果需要使用阻塞方式連接服務(wù)器,則使用 waitForConnected()函數(shù)阻塞程序運行,直到連接成功或失敗。
例如:

socket->connectToHost("192.168.1.100",1340);
    if(socket->waitForConnected(1000)
        qDebug("Connected!");

客戶端與服務(wù)器建立socket連接后,就可以向緩沖區(qū)寫數(shù)據(jù)或從接收緩沖區(qū)讀取數(shù)據(jù),實現(xiàn)數(shù)據(jù)的通信。當(dāng)緩沖區(qū)有新數(shù)據(jù)進(jìn)入時,會發(fā)射readyRead()信號,一般在此信號的槽函數(shù)里面讀取緩沖區(qū)數(shù)據(jù)。

2. 關(guān)鍵源碼闡述

2.1 服務(wù)端代碼

初始化TCP服務(wù)端,綁定信號與槽函數(shù)

    QTcpServer *tcpServer; //TCP服務(wù)器
    QTcpSocket *tcpSocket;//TCP通訊的Socket

    tcpServer=new QTcpServer(this);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

定義了一個TcpServer的對象tcpServer,將獲取的newConnection()信號綁定到自定義的槽函數(shù)onNewConnection()上。

開始監(jiān)聽,選擇IP和端口號

void MainWindow::on_actStart_triggered()
{//開始監(jiān)聽
    QString     IP=ui->comboIP->currentText();//IP地址
    quint16     port=ui->spinPort->value();//端口
    QHostAddress    addr(IP);
    tcpServer->listen(addr,port);//指定ip和端口,這里的IP就是默認(rèn)IP端口也是控件的默認(rèn)值端口
//    tcpServer->listen(QHostAddress::LocalHost,port);// Equivalent to QHostAddress("127.0.0.1").
    ...
    ...
}

下面這個函數(shù)綁定了一些tcp連接的狀態(tài)信號和對應(yīng)的處理函數(shù)。

對于接收到的tcpServer連接,使用nextPending函數(shù)創(chuàng)建socket進(jìn)行通信。

void MainWindow::onNewConnection()
{
//    ui->plainTextEdit->appendPlainText("有新連接");
    tcpSocket = tcpServer->nextPendingConnection(); //創(chuàng)建socket

    connect(tcpSocket, SIGNAL(connected()),
            this, SLOT(onClientConnected()));
    onClientConnected();//

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

    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());

    connect(tcpSocket,SIGNAL(readyRead()),
            this,SLOT(onSocketReadyRead()));
}

服務(wù)端發(fā)送數(shù)據(jù)函數(shù):

void MainWindow::on_btnSend_clicked()
{//發(fā)送一行字符串,以換行符結(jié)束
    QString  msg=ui->editMsg->text();
    ui->plainTextEdit->appendPlainText("[out] "+msg);
    ui->editMsg->clear();
    ui->editMsg->setFocus();

    QByteArray  str=msg.toUtf8();
    str.append('\n');//添加一個換行符
    tcpSocket->write(str);
}

服務(wù)器讀取數(shù)據(jù)

void MainWindow::onSocketReadyRead()
{//讀取緩沖區(qū)行文本
//    QStringList   lines;
    while(tcpSocket->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
//        lines.append(clientConnection->readLine());
}

2.2 客戶端代碼

對于客戶端來說主要是socket通信

初始化客戶端并綁定信號

    QTcpSocket  *tcpClient;  //socket
 	tcpClient=new QTcpSocket(this); //創(chuàng)建socket變量
     connect(tcpClient,SIGNAL(connected()),this,SLOT(onConnected()));
    connect(tcpClient,SIGNAL(disconnected()),this,SLOT(onDisconnected()));

    connect(tcpClient,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    connect(tcpClient,SIGNAL(readyRead()),
            this,SLOT(onSocketReadyRead()));

連接到服務(wù)器

    QString     addr=ui->comboServer->currentText();
    quint16     port=ui->spinPort->value();
    tcpClient->connectToHost(addr,port);

發(fā)送數(shù)據(jù)

void MainWindow::on_btnSend_clicked()
{//發(fā)送數(shù)據(jù)
    QString  msg=ui->editMsg->text();
    ui->plainTextEdit->appendPlainText("[out] "+msg);
    ui->editMsg->clear();
    ui->editMsg->setFocus();

    QByteArray  str=msg.toUtf8();
    str.append('\n');
    tcpClient->write(str);
}

讀取數(shù)據(jù)

void MainWindow::onSocketReadyRead()
{//readyRead()信號槽函數(shù)
    while(tcpClient->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}

以上就是基于QT制作一個TCPServer與TCPClient的通信的詳細(xì)內(nèi)容,更多關(guān)于QT TCP通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用c++寫一個簡單的推箱子小游戲

    利用c++寫一個簡單的推箱子小游戲

    推箱子想必是很多人童年時期的經(jīng)典游戲,我們依舊能記得抱個老人機(jī)娛樂的場景,下面這篇文章主要給大家介紹了關(guān)于如何利用c++寫一個簡單的推箱子小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • MySQL系列教程之使用C語言來連接數(shù)據(jù)庫

    MySQL系列教程之使用C語言來連接數(shù)據(jù)庫

    c語言操作Mysql數(shù)據(jù)庫,主要就是為了實現(xiàn)對數(shù)據(jù)庫的增、刪、改、查等操作,下面這篇文章主要給大家介紹了關(guān)于MySQL系列教程之使用C語言來連接數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 最長公共子字符串的使用分析

    最長公共子字符串的使用分析

    本篇文章是對最長公共子字符串的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C#byte數(shù)組怎么傳入C

    詳解C#byte數(shù)組怎么傳入C

    在本篇內(nèi)容里小編給大家整理了關(guān)于C#byte數(shù)組怎么傳入C的相關(guān)知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2019-03-03
  • C++?Boost?Spirit精通教程

    C++?Boost?Spirit精通教程

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C++入門之實現(xiàn)十步萬度游戲

    C++入門之實現(xiàn)十步萬度游戲

    這篇文章主要介紹了C++入門實現(xiàn)十步萬度游戲,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • C語言聯(lián)合體的實現(xiàn)示例

    C語言聯(lián)合體的實現(xiàn)示例

    C語言聯(lián)合體是一種特殊的數(shù)據(jù)結(jié)構(gòu),它允許在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • C++實現(xiàn)LeetCode(206.倒置鏈表)

    C++實現(xiàn)LeetCode(206.倒置鏈表)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(206.倒置鏈表),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言數(shù)組和指針的問題一道非常值得深思的筆試題

    C語言數(shù)組和指針的問題一道非常值得深思的筆試題

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組和指針的問題一道非常值得深思的筆試題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++ 右值語義相關(guān)總結(jié)

    C++ 右值語義相關(guān)總結(jié)

    這篇文章主要介紹了C++ 右值語義的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02

最新評論

梁山县| 柘荣县| 芮城县| 始兴县| 桓仁| 江阴市| 阳东县| 宾川县| 南汇区| 怀宁县| 大洼县| 吉林省| 天镇县| 辉县市| 天镇县| 稻城县| 马尔康县| 仁寿县| 汶川县| 孟州市| 温泉县| 灵山县| 芷江| 湘潭市| 大化| 睢宁县| 临朐县| 阜康市| 富川| 乌拉特中旗| 洛南县| 油尖旺区| 抚州市| 深圳市| 临泽县| 湟中县| 教育| 庆元县| 铁力市| 深水埗区| 囊谦县|