无忧资源站

 找回密码
 加入我们
查看: 1305|回复: 0

[C/C++] QT网络编程之UDP通讯

[复制链接]

17

主题

30

帖子

197

积分

学徒

Rank: 2

积分
197
发表于 2023-5-11 09:36:08 | 显示全部楼层 |阅读模式
服务端:
头文件:


  1. #ifndef UDPSERVER_H
  2. #define UDPSERVER_H

  3. #include <QWidget>
  4. #include <QtNetwork>

  5. QT_BEGIN_NAMESPACE
  6. namespace Ui { class UdpServer; }
  7. QT_END_NAMESPACE

  8. class UdpServer : public QWidget
  9. {
  10.     Q_OBJECT

  11. public:
  12.     UdpServer(QWidget *parent = nullptr);
  13.     ~UdpServer();

  14. private slots:
  15.     void on_pushButton_start_clicked();

  16.     void on_pushButton_send_clicked();
  17.     void readPendingDatagrams();

  18. private:
  19.     Ui::UdpServer *ui;
  20.     //Udp服务器
  21.     QUdpSocket *mSocket;
  22.     //通信的ip和端口,用于获取发送者的 IP 和端口
  23.     QHostAddress addr;
  24.     quint16 port;
  25. };
  26. #endif // UDPSERVER_H
复制代码
cpp实现:

  1. #include "udpserver.h"
  2. #include "ui_udpserver.h"

  3. UdpServer::UdpServer(QWidget *parent)
  4.     : QWidget(parent)
  5.     , ui(new Ui::UdpServer)
  6. {
  7.     ui->setupUi(this);
  8. }

  9. UdpServer::~UdpServer()
  10. {
  11.     delete ui;
  12. }

  13. //启动
  14. void UdpServer::on_pushButton_start_clicked()
  15. {
  16.     //1.创建QUdpSocket对象
  17.     mSocket = new QUdpSocket(this);

  18.     //2.连接接收数据信号和槽
  19.     QObject::connect(mSocket,&QUdpSocket::readyRead,this,&UdpServer::readPendingDatagrams);


  20.     //3.绑定
  21.     mSocket->bind(QHostAddress::Any,ui->spinBox->value());

  22.     //连接回车发送的信号和槽
  23.     QObject::connect(ui->lineEdit,&QLineEdit::returnPressed,this,&UdpServer::on_pushButton_send_clicked);

  24.     //禁止端口号和启动按钮
  25.     ui->spinBox->setEnabled(false);
  26.     ui->pushButton_start->setEnabled(false);
  27. }

  28. void UdpServer::on_pushButton_send_clicked()
  29. {
  30.     //获取发送的数据
  31.     QByteArray arr = ui->lineEdit->text().toUtf8();

  32.     //发送
  33.     mSocket->writeDatagram(arr,addr,port);
  34.     //显示发送的内容
  35.     ui->textBrowser->insertPlainText("send:"+QString(arr)+"\n");
  36.     //情况lineEdit
  37.     ui->lineEdit->clear();
  38. }

  39. void UdpServer::readPendingDatagrams()
  40. {
  41.     //数据缓冲区
  42.     QByteArray arr;
  43.     while(mSocket->hasPendingDatagrams())
  44.     {

  45.         //调整缓冲区的大小和收到的数据大小一致
  46.         arr.resize(mSocket->bytesAvailable());

  47.         //接收数据
  48.         mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);
  49.         //显示
  50.         ui->textBrowser->insertPlainText(addr.toString()+":"+QString(arr)+"\n");

  51.         //使能发送按钮和编辑框
  52.         ui->lineEdit->setEnabled(true);
  53.         ui->pushButton_send->setEnabled(true);
  54.     }
  55. }
复制代码
客户端:
  1. #ifndef UDPCILENT_H
  2. #define UDPCILENT_H

  3. #include <QWidget>
  4. #include <QtNetwork>

  5. QT_BEGIN_NAMESPACE
  6. namespace Ui { class UdpCilent; }
  7. QT_END_NAMESPACE

  8. class UdpCilent : public QWidget
  9. {
  10.     Q_OBJECT

  11. public:
  12.     UdpCilent(QWidget *parent = nullptr);
  13.     ~UdpCilent();

  14. private slots:
  15.     void on_pushButton_send_clicked();
  16.     void readPendingDatagrams();

  17. private:
  18.     Ui::UdpCilent *ui;
  19.     //UDP客户端
  20.     QUdpSocket *mSocket;
  21. };
  22. #endif // UDPCILENT_H
复制代码
客户端实现:
  1. #include "udpcilent.h"
  2. #include "ui_udpcilent.h"

  3. UdpCilent::UdpCilent(QWidget *parent)
  4.     : QWidget(parent)
  5.     , ui(new Ui::UdpCilent)
  6. {
  7.     ui->setupUi(this);
  8.     //1.创建QUdpSocket
  9.     mSocket = new QUdpSocket(this);
  10.     //2.通信(接收)
  11.     QObject::connect(mSocket,&QUdpSocket::readyRead,this,&UdpCilent::readPendingDatagrams);

  12.     //连接回车发送的信号和槽
  13.     QObject::connect(ui->lineEdit_send,&QLineEdit::returnPressed,this,&UdpCilent::on_pushButton_send_clicked);

  14. }

  15. UdpCilent::~UdpCilent()
  16. {
  17.     delete ui;
  18. }

  19. //发送
  20. void UdpCilent::on_pushButton_send_clicked()
  21. {
  22.     //获取发送的数据
  23.     QByteArray arr = ui->lineEdit_send->text().toUtf8();

  24.     //发送
  25.     //mSocket->writeDatagram(arr,QHostAddress(ui->lineEdit_ip->text()),ui->spinBox->value());
  26.     mSocket->writeDatagram(arr,QHostAddress::Broadcast,ui->spinBox->value());
  27.     //显示发送的内容
  28.     ui->textBrowser->insertPlainText("send:"+QString(arr)+"\n");
  29.     //情况lineEdit
  30.     ui->lineEdit_send->clear();
  31. }

  32. void UdpCilent::readPendingDatagrams()
  33. {
  34.     QHostAddress addr; //用于获取发送者的 IP 和端口
  35.     quint16 port;
  36.     //数据缓冲区
  37.     QByteArray arr;
  38.     while(mSocket->hasPendingDatagrams())
  39.     {
  40.         //调整缓冲区的大小和收到的数据大小一致
  41.         arr.resize(mSocket->bytesAvailable());

  42.         //接收数据
  43.         mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);
  44.         //显示
  45.         ui->textBrowser->insertPlainText(addr.toString()+":"+QString(arr)+"\n");
  46.     }
  47. }
复制代码


QQ|SiteMap|Map|小黑屋|无忧资源站

GMT+8, 2024-5-19 11:37 , Processed in 0.057346 second(s), 19 queries .

无忧资源站

Copyright © 2022-2032 www.wyzyz.net

快速回复 返回顶部 返回列表