先看效果图:
使用QUdpSocket需要在项目的.pro文件里加上:
QUdpSocket通信的步骤如下: 绑定端口,收消息/发消息。
那么看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include "serverwidget.h" #include "ui_serverwidget.h"
ServerWidget::ServerWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::ServerWidget) , socket(nullptr) { ui->setupUi(this); socket = new QUdpSocket(this); socket->bind((quint16)8887); setWindowTitle("port 8887"); connect(socket, &QUdpSocket::readyRead, this, &ServerWidget::dealmsg); connect(ui->sendButton, &QPushButton::clicked, this, &ServerWidget::sendmsg); }
ServerWidget::~ServerWidget() { delete ui; }
void ServerWidget::dealmsg() { char buffer[1024]; memset(buffer, 0, 1024); QHostAddress ip; quint16 port; auto mlen = socket->readDatagram(buffer, 1024, &ip, &port); if(mlen > 0) { QString qs = QString("[%1:%2]:%3").arg(ip.toString()).arg(port).arg(buffer); ui->textEdit->append(qs); } else ui->textEdit->append("Read a shit."); }
void ServerWidget::sendmsg() { QString qs = ui->ipLine->text(); QHostAddress qh(qs); quint16 port = ui->portLine->text().toUInt(); QString msg = ui->textEdit_2->toPlainText(); auto result = socket->writeDatagram(msg.toUtf8(), qh, port); if(result < 0) ui->textEdit->append("Send Error."); else ui->textEdit->append("Send Success."); }
|
然后这是头文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #ifndef SERVERWIDGET_H #define SERVERWIDGET_H
#include <QWidget> #include <QHostAddress> #include <QUdpSocket>
QT_BEGIN_NAMESPACE namespace Ui { class ServerWidget; } QT_END_NAMESPACE
class ServerWidget : public QWidget { Q_OBJECT
public: ServerWidget(QWidget *parent = nullptr); ~ServerWidget(); void dealmsg(); void sendmsg();
private: Ui::ServerWidget *ui; QUdpSocket* socket; }; #endif
|
写完之后如何做到效果图中的效果呢?先运行一个程序,该程序的端口号为8887,然后修改代码,把端口号改成8888,就能实现效果图中的效果了。
然后是关于组播与广播了。想要广播的话用户直接输入255.255.255.255再指定ip即可。
组播的话有点麻烦,需要改一下绑定:
1 2 3 4
| socket->bind(QHostAddress::AnyIPv4, (quint16)8887);
socket->joinMulticastGroup(QHostAddress("244.0.0.1"));
|
然后用户把ip指定为244.0.0.1,端口指定为要接收这个信息的端口即可。假如ip指定了244.0.0.1,端口指定为8888,那么所有绑定了8888端口且加入了244.0.0.1组的UDP套接字都会收到消息。
若是想要离开组的话,使用这段代码:
1
| socket->leaveMulticastGroup(QHostAddress("244.0.0.1"));
|
本篇完。