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);  
时间: 2024-12-21 21:58:52

QUdpSocket 简单用法的相关文章

iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segmentfault.com/blog/alan/1190000002411296 iOS的各种动画相漂亮,相信这是吸引很多人买iPhone的原因之一.不仅如此,这还是吸引我做iOS开发的一大原因,因为在iOS上给界面实现一些像样的动画实在是太轻松了! 这里就介绍一下iOS的block-based an

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

Android中资源文件中的字符串数组string-array简单用法

在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的strings.xml文件里,或是其他自定义的xml中都可以,以下操作方法相同. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球<

expect简单用法

1 #!/usr/expect/bin/expect -f 2 3 4 set loginuser [lrange $argv 0 0] 5 set loginpass [lrange $argv 1 1] 6 set ipaddr [lrange $argv 2 2] 7 set port [lrange $argv 3 3] 8 set timeout [lrange $argv 4 4] 9 set from [lrange $argv 5 5] 10 set to [lrange $ar

Tcpdump 的简单用法

Tcpdump 的简单用法 tcpdump是Linux命令行下使用最广泛的网络分析工具,运行的时候会将网卡运行在混杂模式下,需要root权限才能执行 下面是几个比较常见的参数: -w  保持到指定的文件 -i  指定监听的网卡,缺省显示第一块网卡 -nn 以IP方式显示host -v  显示详细信息 -s  指定数据包大小,缺省是65535 -t  不显示时间 ,缺省是显示时间戳 -c  获取数据包数量,缺省不限制,需要用Ctrl+c来终止 下面是关于命令关键字的说明 1.主要包括host,ne

C++ double转string类型以及MFC控件简单用法

这两天项目需要,测试c++库里面内容.生成jar再给Android调用.我没有学过C++,现在开始记录C++简单用法.测试时候一般都是使用mfc程序来测试,要输入值,显示结果吗.我用的编译环境vs2008. 一.double 转string #include <string> CString strResultx; strResultx.Format(_T("x:%.4f\n"), 89.7887878); 转换结果还是放在strResultx 2.两个字符串相连 CStr

vB SendMessage API 简单用法

vB SendMessage API 简单用法 1. 在Windows编程中,向文本框控件.列表控件.按钮控件等是我们最常接触的控件了.但是在VB中这些控件有时无法实现我们的需要.在这时,我们只要简单的利用Windows API函数就可以扩充这些控件的功能了.顾名思义,SendMessage函数就是向窗口(这里的窗口指的是向按钮.列表框.编辑框等具有hWnd属性的控件)发送消息的函数,该函数的定义如下:Declare Function SendMessage Lib "user32"

java中Object.equals()简单用法

/* equals()方法默认的比较两个对象的引用! */ class Child { int num; public Child(int x){ num = x; } //人文的抛出运行时异常的好处是:可以自定义错误信息! /*public boolean equals(Object o) throws ClassCastException{ if(!(o instanceof Child)) throw new ClassCastException("中文提示:类型错误"); Ch

UIDatePicker的简单用法

// 初始化UIDatePickerUIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, 320, 216)];// 设置时区[datePicker setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];// 设置当前显示时间[datePicker setDate:tempDate animated:YES];// 设置显示最大时间