Qt使用UDP进行单波通信
Qt使用UDP进行单波通信
我们一般学习完基础的一些编程之后就会开始接触网络编程,我们熟悉的网络编程一般会涉及到两个协议一个时TCP,一个是UDP。TCP一般是point to point,UDP一般有单播和广播两种方式,那么我们今天就来学习一下单播。
单播通信
UI界面设计
就不多介绍怎么设计的了,这个和之前讲的是一样的
编写代码
.pro文件
我们要使用网络编程就要引入模块
QT += core gui network
widget.h文件
我们要先引入头文件
#include"QUdpSocket"
然后要声名对象
QUdpSocket *udpSocket
还有我们的槽函数
//读信息要用
void readPendingDatagrams();
完整代码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"QUdpSocket"
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 readPendingDatagrams();
void on_pushButton_3_clicked();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
QUdpSocket *udpSocket;
};
#endif // WIDGET_H
widget.cpp文件
我们创建了udpSocket对象要定义一下,然后实现以下对应的方法
udpSocket = new QUdpSocket(this); // 创建UDP套接字,并设置为当前Widget的子对象
udpSocket->bind(7755); // 绑定套接字到端口7755
// 当UDP套接字有数据可读时,连接信号到槽函数readPendingDatagrams
connect(udpSocket, SIGNAL(readyRead()),
this, SLOT(readPendingDatagrams()));
槽函数的设置
void Widget::readPendingDatagrams()
{
QByteArray tmpByArray;
tmpByArray.resize(udpSocket->pendingDatagramSize()); // 根据待处理数据报的大小调整缓冲区
QHostAddress ipaddr;
quint16 port;
while (udpSocket->hasPendingDatagrams()) {
// 读取数据报,并获取发送方的IP地址和端口号
udpSocket->readDatagram(tmpByArray.data(), udpSocket->pendingDatagramSize(), &ipaddr, &port);
// 将接收到的信息显示在textBrowser控件中
ui->textBrowser->append("接收来自" + ipaddr.toString() + ":" + QString::number(port) + tmpByArray);
}
}
有的朋友就问,为啥要传这些参数,我不知道怎么查看。这个简单:
有问题就看帮助文档!!!这个是最权威的!!!!!!!!!!
或者直接将鼠标放到方法上,就会显示如下内容:
按钮槽函数的绑定
// 当点击发送按钮时,调用此函数
void Widget::on_pushButton_3_clicked()
{
// 在textBrowser中显示发送的文本
ui->textBrowser->append("发送:" + ui->lineEdit->text());
// 向本地地址127.0.0.1的7755端口发送数据
udpSocket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress("127.0.0.1"), 7755);
}
// 当点击绑定按钮时,调用此函数
void Widget::on_pushButton_clicked()
{
udpSocket->bind(7755); // 绑定套接字到端口7755
ui->pushButton->setEnabled(false); // 禁用绑定按钮
ui->pushButton_2->setEnabled(true); // 启用解绑按钮
}
// 当点击解绑按钮时,调用此函数
void Widget::on_pushButton_2_clicked()
{
udpSocket->abort(); // 终止UDP套接字的操作
ui->pushButton->setEnabled(true); // 启用绑定按钮
ui->pushButton_2->setEnabled(false); // 禁用解绑按钮
}