IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> QT实现TCP与UDP的消息收发 -> 正文阅读

[网络协议]QT实现TCP与UDP的消息收发

QT的TCP与UDP通信


1.TCP
TCP通信是基于握手实现的,数据传输相对较为可靠,但实时性较UDP差一些。
2.UDP
UDP通信是基于不可靠实现的,数据传输没有TCP那么靠谱,尽最大能力交付,实时性较好。
两者各有优点和不足,废话不多说,上代码

下面是重点
工程的结构如下。
在这里插入图片描述
工程中的UI文件如下
在这里插入图片描述

1.在QT的工程文件[.pro]里面加入network,如下所示。整个工程文件就改变这一处,其它代码为自动生成,此处不贴出占据版面

QT       += core gui network

2.widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QTimer>
#include <QString>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    // UDP通信
    QUdpSocket *USocket;
    // TCP通信
    QTcpSocket *TSocket;
    QTimer *myTimer;
    // 处理接收到的UDP数据
    void dealUdpData(QByteArray array);

public slots:
    // 读取TCP数据
    void readTcpData();
    // 读取UDP数据
    void readUdpData();


private slots:
    void on_sendData_clicked();
    void timerSend();
    void on_sendData_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    myTimer = new QTimer(this);
    // TCP,监听本地IP的3081端口
    TSocket = new QTcpSocket(this);
    TSocket->connectToHost("127.0.0.1", 3081);
    // UDP,监听所有IP的3080端口
    USocket = new QUdpSocket(this);
    USocket->bind(QHostAddress::AnyIPv4, 3080);
    // 接收TCP
    connect(TSocket, &QTcpSocket::readyRead, this, &Widget::readTcpData);
    // 接收UDP数据
    connect(USocket, &QUdpSocket::readyRead, this, &Widget::readUdpData);
    // 定时发送数据
    connect(myTimer, &QTimer::timeout, this, &Widget::timerSend);
    myTimer->start(1000);
}

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

void Widget::dealUdpData(QByteArray array)
{
    if(array[0]==0xFD && array[1]==0x2A)
    {
        qDebug()<<"接收正确";
    }
    else
    {
        qDebug()<<"接收错误";
    }
}

// 读取TCP的数据
void Widget::readTcpData()
{
    QByteArray tcpData = TSocket->readAll();
    if(tcpData.at(0)==0x01 && tcpData.at(1)==0x02)
    {
        qDebug()<<"报文1段";
        if(tcpData.at(2)==0x03)
        {
            qDebug()<<"接收";
        }
        else if(tcpData.at(2)==0x04)
        {
            qDebug()<<"发送";
        }
    }
    else if(tcpData.at(0)==0x01 && tcpData.at(1)==0x03)
    {
        qDebug()<<"报文2段";
    }
}

// 读取UDP数据
void Widget::readUdpData()
{
    QByteArray array;
    while(USocket->hasPendingDatagrams())
    {
        array.resize(USocket->pendingDatagramSize());
        USocket->readDatagram(array.data(), array.size());
        if(array.size()>0)dealUdpData(array);
    }
}

// 向TCP发送消息
void Widget::on_sendData_clicked()
{
    QString msg = "ABC-123";
    QByteArray array1;
    array1.resize(4);
    // 电源控制
    array1[0]=0xFD;array1[1]=0x2C;array1[2]=0x02;array1[3]=0x02;
    QByteArray bytes = msg.toUtf8();
    if(TSocket->waitForConnected()) {
        TSocket->write(array1);

    }
}

// 定时器,定时向TCP不间断发送数据
void Widget::timerSend()
{
    QByteArray array;
    array.resize(4);
    for(int i=0;i<array.size();i++)
        array[i]=0;
    // 同步
    array[0]=0xFD;array[1]=0x2C;array[2]=0x01;array[3]=0x01;
    if(TSocket->waitForConnected()) {
        TSocket->write(array);
    }
}
// 发送UDP消息
void Widget::on_sendData_2_clicked()
{
    QByteArray array;
    array.resize(5);
    for(int i=0;i<array.size();i++)
        array[i]=0x09+i;
    USocket->writeDatagram(array, QHostAddress("127.0.0.1"), 3082);
}

3.main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

整个界面非常简单,就是两个消息发送按钮。
在这里插入图片描述
如果不想自己新建项目,也可以直接用我的,下面就是下载链接,设置了两个积分,没有积分的联系我免费发送。
https://download.csdn.net/download/weixin_43552197/82743548

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:49:22  更:2022-03-03 16:51:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:47:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码