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

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

 更新時間:2022年08月18日 15:19:51   作者:喝水怪~  
這篇文章主要為大家詳細介紹了Qt網(wǎng)絡編程實現(xiàn)TCP通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Qt網(wǎng)絡編程實現(xiàn)TCP通信,供大家參考,具體內(nèi)容如下

標簽(空格分隔): Tcp通信

一、Tcp簡介

(1)TCP(Transmission Control Protocol,傳輸控制協(xié)議)TCP是一個用于數(shù)據(jù)傳輸?shù)膫鬏攲泳W(wǎng)絡協(xié)議,多個網(wǎng)絡協(xié)議包括(HTTP和FTP都是基于TCP協(xié)議),TCP是面向數(shù)據(jù)流和連接的可靠的傳輸協(xié)議,它區(qū)別于傳輸層的另外一個協(xié)議UDP(具體可看—Qt簡單實現(xiàn)UDP通信) 。

(2)QTcpSocket繼承自QAbstractSocket,與QUdpSocket傳輸?shù)臄?shù)據(jù)報不同的是,QTcpSocket傳輸?shù)氖沁B續(xù)的數(shù)據(jù)流,尤其適合連續(xù)的數(shù)據(jù)傳輸,TCP一般分為客戶端和服務端,即C/S (Client/Server模型)。

(3)QTcpSocket代表了兩個獨立的數(shù)據(jù)流,一個用來讀取數(shù)據(jù),一個用來寫入數(shù)據(jù),分別采用QTcpSocket::read()及QTcpSocket::write()操作,讀取數(shù)據(jù)前先調(diào)用QTcpSocket::bytesAvailable來確定已有足夠的數(shù)據(jù)可用。QTcpServer處理客戶端的連接,可通過QTcpServer::listen()監(jiān)聽客戶端發(fā)來的連接請求,每當有客戶端連接時會發(fā)射newConnection()信號,QTcpSocket可用于讀取客戶端發(fā)來的數(shù)據(jù)報,亦可發(fā)送數(shù)據(jù)報。

二、傳輸層兩大協(xié)議Tcp\Udp的異同

三、小demo實現(xiàn)Tcp客戶端服務端通信

1、服務端:

新建Qt Widgets Application,用作tcp服務端,服務端任何時候只能被動等待連接,繼承自Qwidget類即可,設計ui界面,界面如下:

打開pro文件,添加支持網(wǎng)絡編程模塊,客戶端也需做如下修改:

添加tcp服務端m_tcpServer、tcp服務端套接字m_tcpSocket,在構造函數(shù)中監(jiān)聽客戶端的連接,樣例中服務端主要監(jiān)聽任何任何ip地址上的6666端口,并為客戶端連接時的newConnection信號添加相應的槽函數(shù)。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
? ? Q_OBJECT

public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();
private slots:
? ? void onNewConnect(); ? ?//客戶端新的連接請求處理
? ? void onSendBackMsg(); ? //反饋信息給客戶端新的連接
? ? void onReadMsg(); ? ? ? //服務端讀取客戶端發(fā)來的數(shù)據(jù)
private:
? ? Ui::Widget *ui;
? ? QTcpServer* m_tcpServer; ? ?//tcp服務端
? ? QTcpSocket* m_tcpSocket; ? ?//tcp套接字
};
#endif // WIDGET_H

當服務端收到客戶端的連接時,服務端tcp反饋信息給客戶端,同時客戶端顯示的數(shù)據(jù)顯示到標簽上:

#include "widget.h"
#include "ui_widget.h"
#include <QTcpSocket>
Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget)
{
? ? ui->setupUi(this);
? ? m_tcpServer=new QTcpServer(this);
? ? //服務端監(jiān)聽客戶端發(fā)來的請求
? ? if(!m_tcpServer->listen(QHostAddress::AnyIPv4,6666)){
? ? ? ? qDebug()<<m_tcpServer->errorString();
? ? ? ? close();
? ? }
? ? connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onNewConnect);
? ? connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onSendBackMsg);
}

Widget::~Widget()
{
? ? delete ui;
}

void Widget::onNewConnect()
{
? ? //當前連接的客戶端
? ? m_tcpSocket=m_tcpServer->nextPendingConnection();
? ? //斷開連接
? ? connect(m_tcpSocket,&QTcpSocket::disconnected,
? ? ? ? ? ? m_tcpSocket,&QTcpSocket::deleteLater);
? ? //socket有數(shù)據(jù)時會發(fā)送readyRead信號
? ? connect(m_tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? this,&Widget::onReadMsg);
}
void Widget::onSendBackMsg()
{
? ? QString str="你好,客戶端!";
? ? m_tcpSocket->write(str.toUtf8());
? ? ui->label->setText("反饋數(shù)據(jù)成功!");

}

void Widget::onReadMsg()
{
? ? //服務端將客戶端發(fā)來的數(shù)據(jù)顯示到標簽上
? ? QByteArray bt=m_tcpSocket->readAll();
? ? ui->readLabel->setText(bt);
}

2、客戶端

與服務端一樣,再新建Qt Widgets Application項目,用作tcp客戶端,繼承自Qwidget類即可,設計ui界面,界面如下:

添加客戶端tcp,在pro文件中添加網(wǎng)絡編程模塊network,給連接、發(fā)送按鈕添加點擊信號。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
? ? Q_OBJECT

public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();
private slots:
? ? void onReadMessage(); ? //處理服務端反饋的數(shù)據(jù)
? ? void onDisplayError(QAbstractSocket::SocketError e); ? ?//打印錯誤信息
? ? void on_connectBtn_clicked(); ? //點擊連接按鈕響應信號的槽函數(shù)
? ? void on_sendBtn_clicked(); ?//點擊發(fā)送按鈕響應的槽函數(shù)
private:
? ? Ui::Widget *ui;
? ? QTcpSocket* m_tcpSocket; ? ?//tcp客戶端
};
#endif // WIDGET_H

構造函數(shù)中為服務端發(fā)來數(shù)據(jù)時觸發(fā)的readyRead信號添加了響應的槽函數(shù)onReadMessage,同時設置了客戶端連接時的默認ip地址和端口,onReadMessage槽函數(shù)將服務端反饋的數(shù)據(jù)顯示到標簽上,on_sendBtn_clicked槽函數(shù)中將行編輯框中的內(nèi)容發(fā)送給tcp服務端。

#include "widget.h"
#include "ui_widget.h"
#include <QAbstractSocket>
const int gTcpPort=6666;
Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget)
{
? ? ui->setupUi(this);
? ? m_tcpSocket=new QTcpSocket(this);
? ? //socket有數(shù)據(jù)來了,做處理
? ? connect(m_tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? this,&Widget::onReadMessage);
? ? connect(m_tcpSocket,SIGNAL(QAbstractSocket::SocketError),
? ? ? ? ? ? this,SLOT(onDisplayError(QAbstractSocket::SocketError)));
? ? //設置客戶端連接默認的主機地址及端口號
? ? ui->hostLineEdit->setText("127.0.0.1");
? ? ui->portLineEdit->setText(QString::number(gTcpPort));
}

Widget::~Widget()
{
? ? delete ui;
}

void Widget::onReadMessage()
{
? ? QByteArray bt;
? ? bt.resize(m_tcpSocket->bytesAvailable());
? ? m_tcpSocket->read(bt.data(),bt.size());
? ? //將客戶端反饋的數(shù)據(jù)顯示到標簽上
? ? ui->recvLabel->setText(bt);
}

void Widget::onDisplayError(QAbstractSocket::SocketError e)
{
? ? qDebug()<<"SocketError:"<<e<<endl
? ? ? ? ? ?<<m_tcpSocket->errorString();
}

void Widget::on_connectBtn_clicked()
{
? ? m_tcpSocket->abort();
? ? //連接服務端
? ? m_tcpSocket->connectToHost(ui->hostLineEdit->text(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ui->portLineEdit->text().toInt());
}

void Widget::on_sendBtn_clicked()
{
? ? m_tcpSocket->write(ui->sendEdit->text().toUtf8());
? ? m_tcpSocket->flush();//清空緩沖區(qū)
}

四、運行結果

先打開服務端,再運行客戶端

客戶端采用默認ip和端口,這里的ip地址也可修改為其他,端口必須與服務端監(jiān)聽端口一致,點擊連接:

在行編輯框中隨便輸入內(nèi)容,點擊發(fā)送:

ok達到目的!

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

相關文章

  • C++ Qt開發(fā)之LineEdit單行輸入組件的用法詳解

    C++ Qt開發(fā)之LineEdit單行輸入組件的用法詳解

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹LineEdit單行輸入框組件的常用方法及靈活運用
    2023-12-12
  • C語言數(shù)組入門之數(shù)組的聲明與二維數(shù)組的模擬

    C語言數(shù)組入門之數(shù)組的聲明與二維數(shù)組的模擬

    這篇文章主要介紹了C語言數(shù)組入門之數(shù)組的聲明與二維數(shù)組的模擬,數(shù)組學習的同時也要相應理解C語言指針的作用,需要的朋友可以參考下
    2015-12-12
  • C語言數(shù)據(jù)結構哈希表詳解

    C語言數(shù)據(jù)結構哈希表詳解

    哈希表是一種根據(jù)關鍵碼去尋找值的數(shù)據(jù)映射結構,該結構通過把關鍵碼映射的位置去尋找存放值的地方,說起來可能感覺有點復雜,我想我舉個例子你就會明白了,最典型的的例子就是字典
    2022-02-02
  • C++基于棧實現(xiàn)鐵軌問題

    C++基于棧實現(xiàn)鐵軌問題

    這篇文章主要介紹了C++基于棧實現(xiàn)鐵軌問題,實例分析了C++使用棧實現(xiàn)鐵軌問題的思路與解決方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    這篇文章主要介紹了OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析,需要的朋友可以參考下
    2015-01-01
  • 詳解C語言數(shù)組中是以列優(yōu)先嗎

    詳解C語言數(shù)組中是以列優(yōu)先嗎

    這篇文章主要給大家介紹了關于C語言指針名稱及所指變量的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C語言具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • C語言掃雷游戲的實現(xiàn)

    C語言掃雷游戲的實現(xiàn)

    這篇文章主要為大家詳細介紹了C語言掃雷游戲的實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++實現(xiàn)銀行排隊系統(tǒng)

    C++實現(xiàn)銀行排隊系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)銀行排隊系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C語言實現(xiàn)雙人五子棋游戲

    C語言實現(xiàn)雙人五子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)雙人五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C/C++中字符串流詳解及其作用介紹

    C/C++中字符串流詳解及其作用介紹

    這篇文章主要介紹了C/C++中字符串流詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論

宜黄县| 惠水县| 孙吴县| 准格尔旗| 十堰市| 黄石市| 塔河县| 娄烦县| 当涂县| 山东省| 邮箱| 华宁县| 大港区| 潜江市| 牙克石市| 堆龙德庆县| 九寨沟县| 泰兴市| 武隆县| 板桥市| 杨浦区| 遂平县| 陵水| 永康市| 中山市| 临湘市| 凤庆县| 屏东县| 巨野县| 科技| 宾阳县| 溆浦县| 中超| 墨脱县| 河池市| 富裕县| 大连市| 佛山市| 顺昌县| 兴海县| 嘉黎县|