Qt网络编程之UDP通信(一)聊天窗口的实现

9 篇文章 0 订阅
2 篇文章 1 订阅

一、概述

UDP即用户数据报协议(User Datagram Protocol),为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
当谈到UDP协议时,为了与TCP协议比较,总是会谈到UDP的“不可靠性”。所谓的“不可靠”是指UDP通信双方在数据交换之前无需建立连接,发送方只管将数据发出,至于对方收没收到、数据丢没丢包就不在它的负责范围之内了。而TCP是面向连接的,可靠的通信协议,它的丢包重传机制确保了它的可靠性。至于二者的区别,概括起来就是TCP追求数据传输的可靠性,UDP追求数据传输的效率,因此在很多对实时性要求较高,而可靠性要求不是很高的场景下,如实时视频、语音传输服务中,普遍采用UDP协议。

二、Qt下的UDP通信流程

与TCP通信相比,Qt下的UDP要简单得多。UDP可以实现一对一,一对多,多对多的交互通信,它的每一个应用程序端都是数据收、发二合一的,因此也没有服务器和客户端之分。

  1. Qt项目中,首先在Pro文件中添加network模块:
    QT  += network
    
    包含UDP头文件<QUdpSocket>,并创建通信套接字对象udpSocket
  2. 绑定IP地址和端口号
    udpSocket->bind(QHostAddress::Any,8888);
    
  3. 当接收到数据时,会触发readyRead()信号,绑定数据读取槽函数
    qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
    
    其中,四个参数分别为数据、数据大小、IP地址、端口号,返回一个实际读取到的字节数,如果返回值为-1则表明读取失败;
  4. 发送数据
    qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
    

三、项目代码

在这里插入图片描述
在这里插入图片描述
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void RcvData();

    void on_pushButton_send_clicked();

    void on_pushButton_close_clicked();

private:
    Ui::Widget *ui;

    QUdpSocket *udpSocket;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::Any,8888);   //这个绑定其实是设置自己的端口号
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(RcvData()));
}

Widget::~Widget()
{
    delete ui;
}
void Widget::RcvData()
{
    char buf[1024] = {0};
    QHostAddress address ;
    quint16 port;
    quint64 len = udpSocket->readDatagram(buf,sizeof(buf),&address,&port);
    if(len>0)
    {
        QString str = QString("[%1:%2]:%3").arg(address.toString()).arg(port).arg(buf);
        ui->textEdit_rcv->append(str);
    }
}
void Widget::on_pushButton_send_clicked()
{
    QHostAddress ip = (QHostAddress)ui->lineEdit_ip->text();
    quint16 port = ui->lineEdit_port->text().toInt();
    QString str =  ui->textEdit_send->toPlainText();
    udpSocket->writeDatagram(str.toUtf8().data(),ip,port);
    ui->textEdit_rcv->append(str);
}

void Widget::on_pushButton_close_clicked()
{
    this->close();
}

四、测试

在这里插入图片描述

QT学习过程可以分为以下几个步骤: 1. 安装QT:首先,你需要从QT官网(https://www.qt.io/)下载并安装QT开发环境。根据你的操作系统选择对应的安装包,然后按照安装向导进行安装。 2. 学习基础知识:学习QT的基础知识,包括QT的核心概念、信号与槽机制、界面设计和布局等。可以参考官方文档、教程或者网上的视频教程。 3. 编写简单的QT程序:从简单的窗口应用程序开始,逐步学习和掌握QT的各种组件和功能。可以通过创建项目、设计界面、编写代码和运行程序来加深对QT的理解。 4. 实践项目:选择一个自己感兴趣的项目,尝试使用QT进行开发。可以是一个小工具、游戏或者其他具体应用。通过实践项目,不仅可以巩固之前学到的知识,还能提高问题解决能力和编程经验。 关于串口通信的demo开发过程及代码分享,以下是一个简单的串口通信demo示例: 1. 首先,需要在QT项目中添加串口模块。在.pro文件中添加以下代码: ```shell QT += serialport ``` 2. 在主窗口的头文件中添加串口相关的头文件: ```cpp #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> ``` 3. 在主窗口的类中定义一个QSerialPort对象: ```cpp QSerialPort *serial; ``` 4. 在主窗口的构造函数中初始化串口对象: ```cpp serial = new QSerialPort(this); ``` 5. 设置串口参数,例如波特率、数据位、校验位等: ```cpp serial->setPortName("COM1"); serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); ``` 6. 打开串口: ```cpp serial->open(QIODevice::ReadWrite); ``` 7. 发送数据到串口: ```cpp QByteArray data = "Hello, serial port!"; serial->write(data); ``` 8. 接收串口数据: ```cpp connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData); void MainWindow::readData() { QByteArray data = serial->readAll(); // 处理接收到的数据 } ``` 以上是一个简单的串口通信demo示例,仅供参考。具体的代码实现还需要根据具体的需求进行调整和完善。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值