|
服务端:
头文件:
- #ifndef UDPSERVER_H
- #define UDPSERVER_H
-
- #include <QWidget>
- #include <QtNetwork>
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class UdpServer; }
- QT_END_NAMESPACE
-
- class UdpServer : public QWidget
- {
- Q_OBJECT
-
- public:
- UdpServer(QWidget *parent = nullptr);
- ~UdpServer();
-
- private slots:
- void on_pushButton_start_clicked();
-
- void on_pushButton_send_clicked();
- void readPendingDatagrams();
-
- private:
- Ui::UdpServer *ui;
- //Udp服务器
- QUdpSocket *mSocket;
- //通信的ip和端口,用于获取发送者的 IP 和端口
- QHostAddress addr;
- quint16 port;
- };
- #endif // UDPSERVER_H
复制代码 cpp实现:
- #include "udpserver.h"
- #include "ui_udpserver.h"
-
- UdpServer::UdpServer(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::UdpServer)
- {
- ui->setupUi(this);
- }
-
- UdpServer::~UdpServer()
- {
- delete ui;
- }
-
- //启动
- void UdpServer::on_pushButton_start_clicked()
- {
- //1.创建QUdpSocket对象
- mSocket = new QUdpSocket(this);
-
- //2.连接接收数据信号和槽
- QObject::connect(mSocket,&QUdpSocket::readyRead,this,&UdpServer::readPendingDatagrams);
-
-
- //3.绑定
- mSocket->bind(QHostAddress::Any,ui->spinBox->value());
-
- //连接回车发送的信号和槽
- QObject::connect(ui->lineEdit,&QLineEdit::returnPressed,this,&UdpServer::on_pushButton_send_clicked);
-
- //禁止端口号和启动按钮
- ui->spinBox->setEnabled(false);
- ui->pushButton_start->setEnabled(false);
- }
-
- void UdpServer::on_pushButton_send_clicked()
- {
- //获取发送的数据
- QByteArray arr = ui->lineEdit->text().toUtf8();
-
- //发送
- mSocket->writeDatagram(arr,addr,port);
- //显示发送的内容
- ui->textBrowser->insertPlainText("send:"+QString(arr)+"\n");
- //情况lineEdit
- ui->lineEdit->clear();
- }
-
- void UdpServer::readPendingDatagrams()
- {
- //数据缓冲区
- QByteArray arr;
- while(mSocket->hasPendingDatagrams())
- {
-
- //调整缓冲区的大小和收到的数据大小一致
- arr.resize(mSocket->bytesAvailable());
-
- //接收数据
- mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);
- //显示
- ui->textBrowser->insertPlainText(addr.toString()+":"+QString(arr)+"\n");
-
- //使能发送按钮和编辑框
- ui->lineEdit->setEnabled(true);
- ui->pushButton_send->setEnabled(true);
- }
- }
复制代码 客户端:
- #ifndef UDPCILENT_H
- #define UDPCILENT_H
-
- #include <QWidget>
- #include <QtNetwork>
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class UdpCilent; }
- QT_END_NAMESPACE
-
- class UdpCilent : public QWidget
- {
- Q_OBJECT
-
- public:
- UdpCilent(QWidget *parent = nullptr);
- ~UdpCilent();
-
- private slots:
- void on_pushButton_send_clicked();
- void readPendingDatagrams();
-
- private:
- Ui::UdpCilent *ui;
- //UDP客户端
- QUdpSocket *mSocket;
- };
- #endif // UDPCILENT_H
复制代码 客户端实现:
- #include "udpcilent.h"
- #include "ui_udpcilent.h"
-
- UdpCilent::UdpCilent(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::UdpCilent)
- {
- ui->setupUi(this);
- //1.创建QUdpSocket
- mSocket = new QUdpSocket(this);
- //2.通信(接收)
- QObject::connect(mSocket,&QUdpSocket::readyRead,this,&UdpCilent::readPendingDatagrams);
-
- //连接回车发送的信号和槽
- QObject::connect(ui->lineEdit_send,&QLineEdit::returnPressed,this,&UdpCilent::on_pushButton_send_clicked);
-
- }
-
- UdpCilent::~UdpCilent()
- {
- delete ui;
- }
-
- //发送
- void UdpCilent::on_pushButton_send_clicked()
- {
- //获取发送的数据
- QByteArray arr = ui->lineEdit_send->text().toUtf8();
-
- //发送
- //mSocket->writeDatagram(arr,QHostAddress(ui->lineEdit_ip->text()),ui->spinBox->value());
- mSocket->writeDatagram(arr,QHostAddress::Broadcast,ui->spinBox->value());
- //显示发送的内容
- ui->textBrowser->insertPlainText("send:"+QString(arr)+"\n");
- //情况lineEdit
- ui->lineEdit_send->clear();
- }
-
- void UdpCilent::readPendingDatagrams()
- {
- QHostAddress addr; //用于获取发送者的 IP 和端口
- quint16 port;
- //数据缓冲区
- QByteArray arr;
- while(mSocket->hasPendingDatagrams())
- {
- //调整缓冲区的大小和收到的数据大小一致
- arr.resize(mSocket->bytesAvailable());
-
- //接收数据
- mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);
- //显示
- ui->textBrowser->insertPlainText(addr.toString()+":"+QString(arr)+"\n");
- }
- }
复制代码
|
|