1、关于UDP的基础信息

UDP(user datagram protocol,用户数据报协议)是轻量的、不可靠的、面向数据报(datagram)、无连接的协议,它可以用于对可靠性要求不高的场合。与TCP通信不同,两个程序之间进行UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。 UDP通信相对于TCP通信的实现来说就稍微容易一些了,因为UDP是不需要分客户端和服务器的。只需要用到一个类QUdpSocket。
UDP消息传送有单播、广播、组播三种模式。

  • 单播(unicast)模式:一个UDP客户端发出的数据报只发送到另一个指定网址和端口的UDP客户端,是一对一的数据传输。
  • 广播(broadcast)模式:一个UDP客户端发出的数据报,在同一网络范围内其它所有UDP客户端都能收到。QUdpSocket支持IPv4广播。
  • 组播(multicast)模式:也称为多播。UDP客户端加入到另一个组播IP地址指定的多播组,成员向组播地址发送的数据报组内成员都可以收到,类似于QQ群的功能。

2、设计实现UDP网络编程

第一部分:设计ui界面
(1)先创建一个QT工程
(D:\qt\qt_demo\network_UDP),创建好之后编译运行一下,看有无错误。ok,没有错误,进行下一步。
(2)选择需要的控件
发送框、接收框、本地端口、目标端口(与哪个进程进行通信)、目标IP、三个按钮
(3)布局并运行编译(要将“接收框”的属性改为“只读”)
在这里插入图片描述
(4)给组件修改名字
在这里插入图片描述
第二部分:设计实现逻辑功能
(1)先查看一下关于类QUdpSocket的相关信息以及示例,对头文件等进行设置
在这里插入图片描述
在这里插入图片描述
(2)信号和槽、功能验证
对“打开”进行自动关联;对其功能进行编写;
编写完后之后,打开NetAssist.exe软件进行验证功能。

//实现“打开”的槽函数
void Widget::readyRead_Slot()
{
    //tcp读取数据与udp读取数据是不一样的
    //先判断是否读完了
    while (udpSocket->hasPendingDatagrams())
    {
     //这个hasPendingDatagrams在没有读取完的时候就会返回true
        //先定义一个数组 然后调整数组的大小
     QByteArray array;
     array.resize(udpSocket->pendingDatagramSize());
     //会把数组的大小调整为和udp里剩下的数组一样
     //接下来开始读
     udpSocket->readDatagram(array.data(),array.size());
     //读的数据,读多大
     //在ui界面里面把读到的数据显示出来,但是要转换成QString类型
     QString buf;
     buf = array.data();
     ui->recvEdit->appendPlainText(buf);

    }

}

void Widget::on_openBt_clicked()
{
   if(udpSocket->bind(ui->localPort->text().toUInt()) == true)
    {
         QMessageBox::information(this,"提示","成功");
    }else{

        QMessageBox::information(this,"提示","失败");
    }
    connect(udpSocket, SIGNAL(readyRead()),this, SLOT(readyRead_Slot()));
}

在这里插入图片描述
在这里插入图片描述

接下来,实现“发送”功能,使用自动关联的方式。

void Widget::on_sendBt_clicked()
{
    //先定义变量 然后去包含头文件
    quint16 port;
    QString sendbuff;
    QHostAddress address; //这个是用来存放主机IP的
    address.setAddress((ui->aimIP->text()));  //意思是会把目标ip转化成hostaddress类型

    sendbuff = ui->sendEdit->text();
    port = ui->aimPort->text().toUInt();

    //设置udpSocket
    udpSocket->writeDatagram(sendbuff.toLocal8Bit().data(),sendbuff.length(),address,port);
            //四个参数分别是要发送的数据(将其转换一下类型),发送数据的大小,第三个参数是目标的ip,最后一个参数是端口号
}

写完之后,进行编译运行,无报错。再打开NetAssist软件进行验证功能。在“打开”功能的基础上,进行如下图的“发送”功能验证。
在这里插入图片描述
“关闭”功能依然选择自动关联

void Widget::on_closeBt_clicked()
{
    udpSocket->close();
}

编译运行,进行功能验证。运行之后,用软件给udp发送数据,发几次之后,在编写的udp那里点击“关闭”,就不能再发送过去啦。直到重新打开udp按钮,才可以重新发送。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐