zoukankan      html  css  js  c++  java
  • Qt-网络与通信-UDP网络通讯

    用户数据报协议是一种简单的轻量级、不可靠、面向数据、无连接的传出层协议,可以应用于在可靠性不是十分重要的场合,如短消息,广播信息等。

    例如一下场合

    网络数据大多为短消息

    拥有大量客户端

    对数据安全性无特殊要求

    网络负担飞常重,但对响应速度要求高

    示例截图

    服务器代码

    .h

    #ifndef UDPSERVER_H
    #define UDPSERVER_H
    
    #include <QDialog>
    #include <QLabel>
    #include <QLineEdit>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QUdpSocket>
    #include <QTimer>
    class UdpServer : public QDialog
    {
        Q_OBJECT
    
    public:
        UdpServer(QWidget *parent = 0);
        ~UdpServer();
    
    public slots:
        void StartBtnClicked();
        void timeout();
    private:
        QLabel *TimerLabel;
        QLineEdit *TextLineEdit;
        QPushButton *StartBtn;
        QVBoxLayout *mainLayout;
    
        int port;
        bool isStarted;
        QUdpSocket *udpSocket;
        QTimer *timer;
    
    };
    
    #endif // UDPSERVER_H
    

    .cpp

    #include "udpserver.h"
    
    UdpServer::UdpServer(QWidget *parent)
        : QDialog(parent)
    {
        setWindowTitle(tr("UDP Server"));
        TimerLabel = new QLabel(tr("计时器:"),this);
        TextLineEdit = new QLineEdit(this);
        StartBtn = new QPushButton(tr("Start"),this);
    
        mainLayout = new QVBoxLayout(this);
        mainLayout->addWidget(TimerLabel);
        mainLayout->addWidget(TextLineEdit);
        mainLayout->addWidget(StartBtn);
    
    
        connect(StartBtn,SIGNAL(clicked(bool)),this,SLOT(StartBtnClicked()));
        port = 5555;
        isStarted = false;
        udpSocket = new QUdpSocket(this);
        timer = new QTimer(this);
    
        connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
    }
    
    UdpServer::~UdpServer()
    {
    
    }
    
    void UdpServer::StartBtnClicked()
    {
        if(!isStarted)
        {
            StartBtn->setText("Stop");
            timer->start(1000);
            isStarted = true;
        }
        else
        {
            StartBtn->setText("Start");
            isStarted = false;
            timer->stop();
        }
    }
    
    void UdpServer::timeout()
    {
    
        QString msg = TextLineEdit->text();
        int length = 0;
    
        if(msg =="")
        {
            return;
        }
        if((length = udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port)) != msg.length())
        {
            return;
        }
    }
    

    客户端代码

    .h

    #ifndef UDPCLIENT_H
    #define UDPCLIENT_H
    
    #include <QDialog>
    #include <QVBoxLayout>
    #include <QTextEdit>
    #include <QPushButton>
    #include <QUdpSocket>
    class UdpClient : public QDialog
    {
        Q_OBJECT
    
    public:
        UdpClient(QWidget *parent = 0);
        ~UdpClient();
    public slots:
        void CloseBtnClicked();
        void dataReceived();
    private:
        QTextEdit *ReceiveTextEdit;
        QPushButton *CloseBtn;
        QVBoxLayout *mainLayout;
    
        int port;
        QUdpSocket *udpSocket;
    };
    
    #endif // UDPCLIENT_H
    

    .cpp

    #include "udpclient.h"
    #include <QMessageBox>
    #include <QHostAddress>
    UdpClient::UdpClient(QWidget *parent)
        : QDialog(parent)
    {
        setWindowTitle("UODClient");
        ReceiveTextEdit = new QTextEdit(this);
        CloseBtn = new QPushButton("close",this);
    
        mainLayout = new QVBoxLayout(this);
    
        mainLayout->addWidget(ReceiveTextEdit);
        mainLayout->addWidget(CloseBtn);
    
    
        connect(CloseBtn,SIGNAL(clicked(bool)),this,SLOT(CloseBtnClicked()));
        port = 5555;
        udpSocket = new QUdpSocket(this);
    
        connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
    
        bool result = udpSocket->bind(port);
        if(!result)
        {
            QMessageBox::information(this,"Error","udp socket create error!");
            return;
        }
    }
    
    UdpClient::~UdpClient()
    {
    
    }
    
    void UdpClient::CloseBtnClicked()
    {
        close();
    }
    
    void UdpClient::dataReceived()
    {
        while (udpSocket->hasPendingDatagrams())
        {
            QByteArray datagram;
            datagram.resize(udpSocket->pendingDatagramSize());
            udpSocket->readDatagram(datagram.data(),datagram.size());
            QString msg = datagram.data();
            ReceiveTextEdit->insertPlainText(msg);
        }
    
    }
    

    工程连接:https://gitee.com/DreamLife-Technology_DreamLife/UDPProject

  • 相关阅读:
    Python基础学习笔记(10)形参 命名空间
    10 练习题:形参 命名空间
    09 练习题:函数、参数
    4.题库
    第三章:构造NFA DFA
    第二章
    第一章
    83.jquery的筛选与过滤
    82.认识jQuery以及选择器
    81.案例 初始化、拖拽、缓冲
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9159985.html
Copyright © 2011-2022 走看看