日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中UDP通信的简单示例

發布時間:2024/9/27 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中UDP通信的简单示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

udp通信分為發送端和接收端,通信步驟可以分為以下:

接收端:
  • 創建QUdpSocket對象。在.h文件中添加類的前置聲明,定義該類的指針,在.cpp的構造函數中定義指向該類的指針。
  • bind()。綁定IP和端口。
  • connect()。綁定readyRead()信號,當有數據到來的時候,觸發這個信號,在對應的槽函數中處理數據,讀數據調用readDatagram()函數,在第三,四個參數可以保存發送端的IP和端口。
  • 發送端:

    1.創建QUdpSocket對象。在.h文件中添加類的前置聲明,定義該類的指針,在.cpp的構造函數中定義指向該類的指針。
    2.發送數據。調用writeDatagram()函數發送數據到指定的IP和端口。
    下面是界面效果:


    發送端的代碼:
    Send.h

    #ifndef SEND_H #define SEND_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Send; } QT_END_NAMESPACEclass QUdpSocket;class Send : public QDialog {Q_OBJECTpublic:Send(QWidget *parent = nullptr);~Send();private slots:void on_textEdit_cursorPositionChanged();void on_sendButton_clicked();private:Ui::Send *ui;QUdpSocket *sender; }; #endif // DIALOG_H

    Send.cpp

    #include "Send.h" #include "ui_Send.h" #include <QtNetwork> #include <QDebug>Send::Send(QWidget *parent): QDialog(parent), ui(new Ui::Send) {ui->setupUi(this);setWindowTitle(tr("發送端"));sender = new QUdpSocket(this);ui->sendButton->setEnabled(false); }Send::~Send() {delete ui; }void Send::on_textEdit_cursorPositionChanged() {if(!ui->textEdit->toPlainText().isEmpty()){ui->sendButton->setEnabled(true);} }void Send::on_sendButton_clicked() {QByteArray text = ui->textEdit->toPlainText().toUtf8();//每次只發送輸入的哪些文字,不會追加qint64 bytes = sender->writeDatagram(text,text.size(),QHostAddress::LocalHost,7777);if(bytes == -1){qDebug()<<"發送數據失敗!";return ;} }

    接收端的代碼:
    Receive.h

    #ifndef RECEIVE_H #define RECEIVE_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Receive; } QT_END_NAMESPACEclass QUdpSocket; class QTimer;class Receive : public QDialog {Q_OBJECTpublic:Receive(QWidget *parent = nullptr);~Receive(); private slots:void slot_readyRead();void slot_error();void slot_timeout(); private:Ui::Receive *ui;QUdpSocket *receiver;QTimer *timer; }; #endif // RECEIVE_H

    Receive.cpp

    #include "receive.h" #include "ui_receive.h" #include <QtNetwork> #include <QDebug> #include <QTimer>Receive::Receive(QWidget *parent): QDialog(parent), ui(new Ui::Receive) {ui->setupUi(this);setWindowTitle(tr("接收端"));receiver = new QUdpSocket(this);receiver->bind(QHostAddress("127.0.0.1"),7777);connect(receiver,&QUdpSocket::readyRead,this,&Receive::slot_readyRead);timer = new QTimer(this);connect(timer,&QTimer::timeout,this,&Receive::slot_timeout); // void (QUdpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QUdpSocket::error; // connect(receiver,errorSign,this,&Receive::slot_error);//用不上error信號,發送端與接收端是無連接的,給關閉發送端,//對于接收端沒有聯動的影響 }Receive::~Receive() {delete ui; }void Receive::slot_readyRead() {if(receiver->hasPendingDatagrams()){QHostAddress sendAddr;//發送者的IP地址quint16 port;//發送者的端口QByteArray text;text.resize(receiver->pendingDatagramSize());receiver->readDatagram(text.data(),(qint64)text.size(),&sendAddr,&port);qDebug()<<sendAddr.toString()<<port;//輸出發送端的IP和端口號,(端口號還不是和能理解,為什么不是7777)ui->textEdit->setPlainText(text);//會自動在上一次的內容后面追加ui->label->setText(tr("數據接收完成!"));timer->start(2000);} }void Receive::slot_error() {qDebug()<<receiver->errorString();receiver->close(); }void Receive::slot_timeout() {ui->label->setText(tr(" ")); }

    以上是UDP通信時,發送端與接收端的代碼,其main.cpp文件沒有任何的改變,所以沒有貼,由于Udp是無連接的,所以最后關于close()套接字,一般沒有用到,因為發送完消息之后,調用close()來關閉套接字和沒有調用close()關閉套接字的效果是一樣的,他們之間沒有連接,只是在傳輸數據時指定了端口與IP,當然很多東西還沒有接觸到具體視情況而定close()的有無。

    總結

    以上是生活随笔為你收集整理的Qt中UDP通信的简单示例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。