#include "HxBroadcast.h" #include #include #include HxBroadcast *broadcast = nullptr; HxBroadcast *HxBroadcast::context() { return broadcast; } void HxBroadcast::initialization(int port, QString ip) { broadcast = new HxBroadcast(); broadcast->ip = ip; broadcast->port = port; broadcast->socket = new QUdpSocket(); connect(broadcast->socket, &QUdpSocket::readyRead, broadcast, &HxBroadcast::receive_ready_read); connect(broadcast, &HxBroadcast::publish_event, broadcast, &HxBroadcast::publish_achieve); } void HxBroadcast::publish(QString message) { emit broadcast->publish_event(message); } void HxBroadcast::publish_json(int action_type, QJsonObject msginfo) { QJsonObject root; root.insert("action_type", action_type); root.insert("msgInfo", msginfo); publish(QJsonDocument(root).toJson(QJsonDocument::Compact)); } void HxBroadcast::publish_json(int action_type, std::initializer_list> args) { QJsonObject msginfo; for (std::initializer_list>::const_iterator i = args.begin(); i != args.end(); ++i) msginfo.insert(i->first, i->second); publish_json(action_type, msginfo); } void HxBroadcast::publish_achieve(QString message) { if(ip.isEmpty()) socket->writeDatagram(message.toUtf8(), QHostAddress::Broadcast, broadcast->port); else socket->writeDatagram(message.toUtf8(), QHostAddress(ip), broadcast->port); } void HxBroadcast::receive_ready_read() { /* 拥有等待的数据报 */ while (socket->hasPendingDatagrams()) { QByteArray datagram; /* 让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据 */ datagram.resize(socket->pendingDatagramSize()); /* 接收数据报,将其存放到datagram中 */ socket->readDatagram(datagram.data(), datagram.size()); emit broadcast->receive_event(datagram); } }