嵌入式学习之QT学习---9 QT网络编程之UDP通信
1、关于UDP的基础信息UDP(user datagram protocol,用户数据报协议)是轻量的、不可靠的、面向数据报(datagram)、无连接的协议,它可以用于对可靠性要求不高的场合。与TCP通信不同,两个程序之间进行UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。 UDP通信相对于TCP通信的实现来说就稍微容易一些了,因为UDP是不需要分客户
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按钮,才可以重新发送。
更多推荐
所有评论(0)