qt和服务器收发信息,QUdpSocket-Qt使用Udp通讯实现服务端和客户端(示例代码)

版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:

本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:http://techieliang.com/2017/12/532/

1. QNetworkDatagram

qt网络报文,可用其建立一个通讯内容包括目标ip、端口号、数据内容。同时接收到的信息也未此类型,可以访问接收数据的长度、发送者的ip及端口等信息

详情请见帮助

QUdpSocket

有Qt提供的udp通讯的类,详细介绍请见官方文档

2. 客户端

注意pro文件要包含QT += network

#include

#include

QUdpSocket *m_socket=newQUdpSocket;

m_socket.writeDatagram(msg, QHostAddress::localhost, 8000);

qudpsocket对于发送数据报文提供了三个重载函数:

qint64 writeDatagram(constchar*data, qint64 size, constQHostAddress &address, quint16 port)

qint64 writeDatagram(constQNetworkDatagram &datagram)

qint64 writeDatagram(constQByteArray &datagram, constQHostAddress &host, quint16 port)

上面的范例使用的是第三种类型,也可以自行建立QNetworkDatagram对象,修改好内容后直接调用writeDatagram

3. 服务端

服务端与客户端类似,需要先绑定端口“bind”,此函数在QAbstractSocket类中提供

boolbind(constQHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform)

boolbind(quint16 port = 0, BindMode mode = DefaultForPlatform)

具体使用方式:

m_socket = newQUdpSocket;

m_socket->bind(QHostAddress::localhost, 8000);

connect(m_socket, SIGNAL(readyRead()), this, SLOT(receive()));

绑定端口以后,需要将此socket的readyread信号与自定义槽函数连接,当服务端收到消息时会触发此信号。

4. 消息收发

由于udp与tcp不同,不需要三次握手建立连接,所以并不会在连接之后记录当前socket。

发送消息在客户端中已经提供示例

接收消息需要使用Qudpsocket提供以下函数:

qint64 pendingDatagramSize()const

qint64 readDatagram(char*data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)

QNetworkDatagram receiveDatagram(qint64 maxSize = -1)

当readyRead信号触发时,可直接通过receiveDatagram函数获取消息报文对象,其内存储消息的发送ip、端口、消息内容等所有信息。

也可以通过pendingDatagramSize判断消息长度,然后通过readDatagram获取消息内容。

在readyRead槽函数中可以先调用QUdpSocket::hasPendingDatagrams判断当前是否有需要读取的消息,若有消息再进行pendingDatagramSize获取需要读取的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt使用UDP组播进行服务器客户收发时,需要先确定服务器的IP地址和口,然后客户加入服务器的组播组进行收发。以下是一个简单的示例代码服务器: ```cpp // 创建UDP socket QUdpSocket *socket = new QUdpSocket(this); // 绑定本地收发口 socket->bind(QHostAddress::AnyIPv4, 12345, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); // 加入组播组 socket->joinMulticastGroup(QHostAddress("239.255.255.250")); // 接收数据 connect(socket, &QUdpSocket::readyRead, this, [=](){ while (socket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(socket->pendingDatagramSize()); socket->readDatagram(datagram.data(), datagram.size()); // 处理接收到的数据 } }); // 发送数据 QByteArray data = "Hello World"; QHostAddress groupAddress("239.255.255.250"); quint16 groupPort = 12345; socket->writeDatagram(data, groupAddress, groupPort); ``` 在上面的代码中,服务器的IP地址和口都设置为本地IP地址和`12345`口。服务器加入组播组并进行收发客户: ```cpp // 创建UDP socket QUdpSocket *socket = new QUdpSocket(this); // 绑定本地收发口 socket->bind(QHostAddress::AnyIPv4, 54321, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); // 加入服务器的组播组 socket->joinMulticastGroup(QHostAddress("239.255.255.250")); // 接收数据 connect(socket, &QUdpSocket::readyRead, this, [=](){ while (socket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(socket->pendingDatagramSize()); socket->readDatagram(datagram.data(), datagram.size()); // 处理接收到的数据 } }); // 发送数据 QByteArray data = "Hello World"; QHostAddress serverAddress("服务器IP地址"); quint16 serverPort = 12345; // 服务器口 socket->writeDatagram(data, serverAddress, serverPort); ``` 在客户中,需要指定服务器的IP地址和口进行发送。客户加入服务器的组播组并进行收发客户的IP地址和口都设置为本地IP地址和`54321`口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值