qudpsocket是怎么用的

udp是无连接的不可靠的传输协议,可以用在可靠传输不是很重要的情况下使用。 qudpsocket是qabstractsocket 的子类,它们都继承了qiodevice。所以可以用qudpsocket进行发送接收数据。它和qtcpsocket最大的区别也就是,发送数据之前不需要建立连接
以下简单例子,演示了用qudpsocket如何实现客户端和服务端的通信。
服务端代码: [cpp] view plain copy
1. class udpserver:public qobject
2. {
3. q_object
4. public:
5. udpserver(qobject *parent = null);
6. ~udpserver();
7. private slots:
8. void readpendingdatagrams();
9. private:
10. qudpsocket *udpsocket;
11.
12. };
[cpp] view plain copy
1. udpserver::udpserver(qobject *parent /* = null */):qobject(parent)
2. {
3. udpsocket = new qudpsocket(this);
4. udpsocket-》bind(qhostaddress::localhost, 7755);
5. cout《《“server is running.。。。。。”《《endl;
6. connect(udpsocket, signal(readyread()),this, slot(readpendingdatagrams()));
7. }
8.
9. udpserver::~udpserver()
10. {
11.
12. }
13.
14. void udpserver::readpendingdatagrams()
15. {
16. qhostaddress sender;
17. quint16 senderport;
18. while (udpsocket-》haspendingdatagrams())
19. {
20. qbytearray datagram;
21. datagram.resize(udpsocket-》pendingdatagramsize());
22. udpsocket-》readdatagram(datagram.data(), datagram.size(),&sender, &senderport);
23. string strmes(datagram);
24. std::cout《《strmes《《endl;
25. }
26. qstring text = “hello 。。。”;
27. qbytearray datagram = text.tolocal8bit();
28. udpsocket-》writedatagram(datagram.data(),datagram.size(),sender, senderport);
29. }
说明:
1. 我都是在自己的机器上测试,所以服务器地址都是localhost。即
[cpp] view plain copy
udpsocket-》bind(qhostaddress::localhost, 7755);
2. 给客户端回发信息
[cpp] view plain copy
udpsocket-》writedatagram(datagram.data(),datagram.size(),sender, senderport);
客户端代码: [cpp] view plain copy
1. class udpclient : public qwidget
2. {
3. q_object
4.
5. public:
6. udpclient(qwidget *parent = 0, qt::wflags flags = 0);
7. ~udpclient();
8.
9. private slots:
10. void sendmessageslot();
11. void readpendingdatagrams();
12. private:
13. qudpsocket *udpsocket;
14. qlineedit *m_pledit;
15. qpushbutton *m_psendmesbtn;
16. qlabel *m_pmessage;
18. };
[cpp] view plain copy
1. udpclient::udpclient(qwidget *parent, qt::wflags flags)
2. : qwidget(parent, flags)
3. {
4. m_pledit = new qlineedit(this);
5. m_psendmesbtn = new qpushbutton(tr(“sending”),this);
6. udpsocket = new qudpsocket(this);
7. m_pmessage = new qlabel(this);
8. qhostaddress sender = udpsocket-》localaddress();
9. quint16 senderport = udpsocket-》localport();
10. udpsocket-》bind(sender,senderport);
11. m_pledit-》setgeometry(5,5,100,20);
12. m_psendmesbtn-》setgeometry(110,5,50,20);
13. m_pmessage-》setgeometry(5,30,150,20);
14. m_pledit-》setstylesheet(“qlineedit{color:red}”);
15. connect(m_psendmesbtn, signal(clicked()),this, slot(sendmessageslot()));
16. connect(udpsocket, signal(readyread()),this, slot(readpendingdatagrams())); 19.
20. }
21.
22. udpclient::~udpclient()
23. {
24.
25. }
26.
27. void udpclient::sendmessageslot()
28. {
29. qstring text = m_pledit-》text();
30. qbytearray datagram = text.tolocal8bit();
31. udpsocket-》writedatagram(datagram.data(),datagram.size(),qhostaddress::localhost, 7755);
32. }
33.
34. void udpclient::readpendingdatagrams()
35. {
36. while (udpsocket-》haspendingdatagrams())
37. {
38. qbytearray datagram;
39. datagram.resize(udpsocket-》pendingdatagramsize());
40. qhostaddress sender;
41. quint16 senderport;
42. udpsocket-》readdatagram(datagram.data(), datagram.size(),&sender, &senderport);
43. qstring text = qstring(datagram);
44. m_pmessage-》settext(text);
45. }
46. }
说明:
1. 绑定本地地址和端口,以接收客户端发过来的信息
[cpp] view plain copy
a. qhostaddress sender = udpsocket-》localaddress();
b. quint16 senderport = udpsocket-》localport();
c. udpsocket-》bind(sender,senderport);
qudpsocket简单使用demo(局域网内发送给所有客户端消息与接收) 先看一下效果:
服务端和客户端都用到一个公共类: udpserverandclient.h:
#ifndef udpserverandclient_h
#define udpserverandclient_h
#include 《qobject》
#include 《qudpsocket》
#include 《qtimer》
class udpserverandclient : public qobject
{
q_object
public:
explicit udpserverandclient(qobject *parent = 0);
void setserverinit();
void setclientinit();
private slots:
void onserversendbroadcast();
void onpendingdatagrams();
private:
qudpsocket udpsocketserver;
qudpsocket udpsocketclient;
qtimer timer;
};
#endif // udpserverandclient_h
udpserverandclient.cpp:
#include “udpserverandclient.h”
#include 《qhostinfo》
#include 《qdatastream》
#include 《qdatetime》
udpserverandclient::udpserverandclient(qobject *parent) : qobject(parent)
{
}
void udpserverandclient::setserverinit()
{
connect(&timer, signal(timeout()), this, slot(onserversendbroadcast())); //定时发送
timer.start(2000);
}
void udpserverandclient::setclientinit()
{
udpsocketclient.bind(13999); //建立监听
connect(&udpsocketclient, signal(readyread()), this, slot(onpendingdatagrams())); //接收准备
}
void udpserverandclient::onserversendbroadcast()
{
qbytearray datagram;
qdatastream out(&datagram, qiodevice::writeonly);
out.setversion(qdatastream::qt_5_6);
out 《《 qdatetime::currentdatetime() 《《 qhostinfo::fromname(qhostinfo::localhostname()).addresses().last().tostring();
//发送主机可以用qhostaddress(“127.0.0.1”)替换
udpsocketserver.writedatagram(datagram, qhostaddress::broadcast, 13999); // udp 发送数据
}
void udpserverandclient::onpendingdatagrams()
{
qbytearray datagram;
do{
datagram.resize(udpsocketclient.pendingdatagramsize());
udpsocketclient.readdatagram(datagram.data(), datagram.size()); //接收数据
} while( udpsocketclient.haspendingdatagrams() );
qdatetime datetime;
qstring lastip;
qdatastream in(&datagram, qiodevice::readonly);
in.setversion(qdatastream::qt_5_6);
in 》》 datetime 》》 lastip;
qdebug() 《《“datetime.date().tostring():” 《《 datetime.date().tostring()
《《“ip:” 《《 lastip;
}

比较PCB质量控制选项:确保正确构建电路板
ADIBlackfin®处理器助力网络制造流程缺陷检测系统的发展
2020年3月国内增值电信业务许可情况分析
ESP32在1.54寸彩屏的应用
共模电感和差模电感在电路中的区别
qudpsocket是怎么用的
魅族Pro7什么时候上市?最新消息:魅族Pro7夏季演唱会开启,双屏+首发联发科X30板上钉钉
MSP430x09x系列 MCU在电动剃须刀中的应用
Google I/O将重点讲解Android 3.0
全球十大动力电池企业盘点之三:三星SDI
瞄准城市停车难“痛点” 超声波传感器助力智能停车黑科技
创意diy吊车制作图解
漫谈八木天线
Windows 10二月度更新补丁引发网络链接问题 微软推出可选更新解决相关问题
机器人终于流上了机器血
VK0192 LQFP44 192点阵3/4线串行接口LCD驱动芯片,LCD显示驱动芯片
固态硬盘接口的详细资料讲解分析
分享一下关于Linux服务器开发中相关数据去重的做法
巧用调压器获得固定的110V电压
贴片电感供应商告诉你贴片共模电感有方向吗