欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

一、Tcp簡(jiǎn)介

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

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

(3)QTcpSocket代表了兩個(gè)獨(dú)立的數(shù)據(jù)流,一個(gè)用來(lái)讀取數(shù)據(jù),一個(gè)用來(lái)寫(xiě)入數(shù)據(jù),分別采用QTcpSocket::read()及QTcpSocket::write()操作,讀取數(shù)據(jù)前先調(diào)用QTcpSocket::bytesAvailable來(lái)確定已有足夠的數(shù)據(jù)可用。QTcpServer處理客戶(hù)端的連接,可通過(guò)QTcpServer::listen()監(jiān)聽(tīng)客戶(hù)端發(fā)來(lái)的連接請(qǐng)求,每當(dāng)有客戶(hù)端連接時(shí)會(huì)發(fā)射newConnection()信號(hào),QTcpSocket可用于讀取客戶(hù)端發(fā)來(lái)的數(shù)據(jù)報(bào),亦可發(fā)送數(shù)據(jù)報(bào)。

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

三、小demo實(shí)現(xiàn)Tcp客戶(hù)端服務(wù)端通信

1、服務(wù)端:

新建Qt Widgets Application,用作tcp服務(wù)端,服務(wù)端任何時(shí)候只能被動(dòng)等待連接,繼承自Qwidget類(lèi)即可,設(shè)計(jì)ui界面,界面如下:

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

添加tcp服務(wù)端m_tcpServer、tcp服務(wù)端套接字m_tcpSocket,在構(gòu)造函數(shù)中監(jiān)聽(tīng)客戶(hù)端的連接,樣例中服務(wù)端主要監(jiān)聽(tīng)任何任何ip地址上的6666端口,并為客戶(hù)端連接時(shí)的newConnection信號(hào)添加相應(yīng)的槽函數(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(); ? ?//客戶(hù)端新的連接請(qǐng)求處理
? ? void onSendBackMsg(); ? //反饋信息給客戶(hù)端新的連接
? ? void onReadMsg(); ? ? ? //服務(wù)端讀取客戶(hù)端發(fā)來(lái)的數(shù)據(jù)
private:
? ? Ui::Widget *ui;
? ? QTcpServer* m_tcpServer; ? ?//tcp服務(wù)端
? ? QTcpSocket* m_tcpSocket; ? ?//tcp套接字
};
#endif // WIDGET_H

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

#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);
? ? //服務(wù)端監(jiān)聽(tīng)客戶(hù)端發(fā)來(lái)的請(qǐng)求
? ? 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()
{
? ? //當(dāng)前連接的客戶(hù)端
? ? m_tcpSocket=m_tcpServer->nextPendingConnection();
? ? //斷開(kāi)連接
? ? connect(m_tcpSocket,&QTcpSocket::disconnected,
? ? ? ? ? ? m_tcpSocket,&QTcpSocket::deleteLater);
? ? //socket有數(shù)據(jù)時(shí)會(huì)發(fā)送readyRead信號(hào)
? ? connect(m_tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? this,&Widget::onReadMsg);
}
void Widget::onSendBackMsg()
{
? ? QString str="你好,客戶(hù)端!";
? ? m_tcpSocket->write(str.toUtf8());
? ? ui->label->setText("反饋數(shù)據(jù)成功!");

}

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

2、客戶(hù)端

與服務(wù)端一樣,再新建Qt Widgets Application項(xiàng)目,用作tcp客戶(hù)端,繼承自Qwidget類(lèi)即可,設(shè)計(jì)ui界面,界面如下:

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

#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(); ? //處理服務(wù)端反饋的數(shù)據(jù)
? ? void onDisplayError(QAbstractSocket::SocketError e); ? ?//打印錯(cuò)誤信息
? ? void on_connectBtn_clicked(); ? //點(diǎn)擊連接按鈕響應(yīng)信號(hào)的槽函數(shù)
? ? void on_sendBtn_clicked(); ?//點(diǎn)擊發(fā)送按鈕響應(yīng)的槽函數(shù)
private:
? ? Ui::Widget *ui;
? ? QTcpSocket* m_tcpSocket; ? ?//tcp客戶(hù)端
};
#endif // WIDGET_H

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

#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ù)來(lái)了,做處理
? ? connect(m_tcpSocket,&QTcpSocket::readyRead,
? ? ? ? ? ? this,&Widget::onReadMessage);
? ? connect(m_tcpSocket,SIGNAL(QAbstractSocket::SocketError),
? ? ? ? ? ? this,SLOT(onDisplayError(QAbstractSocket::SocketError)));
? ? //設(shè)置客戶(hù)端連接默認(rèn)的主機(jī)地址及端口號(hào)
? ? 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());
? ? //將客戶(hù)端反饋的數(shù)據(jù)顯示到標(biāo)簽上
? ? 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();
? ? //連接服務(wù)端
? ? 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ū)
}

四、運(yùn)行結(jié)果

先打開(kāi)服務(wù)端,再運(yùn)行客戶(hù)端

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

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

ok達(dá)到目的!

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

相關(guān)文章

  • C語(yǔ)言 詳解字符串基礎(chǔ)

    C語(yǔ)言 詳解字符串基礎(chǔ)

    在 C 語(yǔ)言中,字符串實(shí)際上是使用空字符 \0 結(jié)尾的一維字符數(shù)組。因此,\0 是用于標(biāo)記字符串的結(jié)束??兆址∟ull character)又稱(chēng)結(jié)束符,縮寫(xiě) NUL,是一個(gè)數(shù)值為 0 的控制字符,\0 是轉(zhuǎn)義字符,意思是告訴編譯器,這不是字符 0,而是空字符
    2022-04-04
  • C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言時(shí)間函數(shù)之strftime()詳解

    C語(yǔ)言時(shí)間函數(shù)之strftime()詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言時(shí)間函數(shù)之strftime(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++學(xué)習(xí)之初始化列表詳解

    C++學(xué)習(xí)之初始化列表詳解

    這篇文章主要為大家詳細(xì)介紹了C++中初始化列表的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,需要的小伙伴可以了解一下
    2023-03-03
  • C語(yǔ)言創(chuàng)建windows窗口實(shí)例

    C語(yǔ)言創(chuàng)建windows窗口實(shí)例

    這篇文章主要介紹了C語(yǔ)言創(chuàng)建windows窗口實(shí)例,本文直接給出實(shí)現(xiàn)代碼,同時(shí)講解了編碼的步驟,需要的朋友可以參考下
    2015-04-04
  • C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法

    C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法

    這篇文章主要為大家詳細(xì)介紹了C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 解讀C++11 原生字符串

    解讀C++11 原生字符串

    這篇文章主要介紹了C++11 原生字符串的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++11,感興趣的朋友可以了解下
    2020-08-08
  • C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式

    C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)

    詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)

    本文主要為大家講解一下三個(gè)C++中的運(yùn)算符重載,分別是賦值運(yùn)算符重載、關(guān)系運(yùn)算符重載和函數(shù)調(diào)用運(yùn)算符重載,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • C++中的偽隨機(jī)數(shù)

    C++中的偽隨機(jī)數(shù)

    這篇文章主要介紹了C++中的偽隨機(jī)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論