Qt中的UDP通信

来源:互联网 发布:小幸软件工作室 编辑:程序博客网 时间:2024/05/19 18:12

简述

    相对TCP来说,UDP是一种无状态的连接,不存在客户端和服务端之分,没有监听一说,所以相对简单。


实现    Qt4.8

代码

udpwid.h

#ifndef UDPWID_H#define UDPWID_H#include <QWidget>#include <QPushButton>#include <QTextEdit>#include <QUdpSocket>namespace Ui {class udpWid;}class udpWid : public QWidget{    Q_OBJECT    public:    explicit udpWid(QWidget *parent = 0);    ~udpWid();     void initWidget();private slots:     void sendData();     void ReceData();private:    Ui::udpWid *ui;    QPushButton *m_SendButton;    QPushButton *m_CloseButton;    QTextEdit *m_SendText;    QTextEdit *m_ReceText;    QUdpSocket *m_UdpSocket;};#endif // UDPWID_H

udpwid.cpp

#include "udpwid.h"#include "ui_udpwid.h"#include <QHBoxLayout>#include <QVBoxLayout>#include <QHostAddress>#include <QDebug>udpWid::udpWid(QWidget *parent) :    QWidget(parent),    ui(new Ui::udpWid){    ui->setupUi(this);    initWidget();    m_UdpSocket = new QUdpSocket(this);    m_UdpSocket->bind(5555);    connect(m_UdpSocket, SIGNAL(readyRead()), this, SLOT(ReceData()));    connect(m_SendButton, SIGNAL(pressed()), this, SLOT(sendData()));}udpWid::~udpWid(){    delete ui;}void udpWid::initWidget(){    this->resize(800,600);    this->setWindowTitle("ServerWidget_port:5555");    QVBoxLayout *VLayoutText = new QVBoxLayout(this);    VLayoutText->setMargin(4);    QWidget *TextWidget = new QWidget(this);    TextWidget->setLayout(VLayoutText);    m_ReceText = new QTextEdit(TextWidget);    m_ReceText->setReadOnly(true);    m_SendText = new QTextEdit(TextWidget);    m_SendText->setMaximumHeight(100);    VLayoutText->addWidget(m_ReceText);    VLayoutText->addWidget(m_SendText);    QHBoxLayout *HLayoutButton = new QHBoxLayout(this);    HLayoutButton->setMargin(4);    QWidget *ButtonWidget = new QWidget(this);    ButtonWidget->setLayout(HLayoutButton);    m_SendButton = new QPushButton(this);    m_SendButton->setText(QString("Send").toUtf8().data());    m_CloseButton = new QPushButton(this);    m_CloseButton->setText(QString("Close").toUtf8().data());    HLayoutButton->addWidget(m_SendButton);    HLayoutButton->addStretch();    HLayoutButton->addWidget(m_CloseButton);    QVBoxLayout *VLayoutMain = new QVBoxLayout(this);    VLayoutMain->setMargin(2);    this->setLayout(VLayoutMain);    VLayoutMain->addWidget(TextWidget);    VLayoutMain->addWidget(ButtonWidget);}void udpWid::sendData(){    QString str = m_SendText->toPlainText();    m_SendText->clear();    m_UdpSocket->writeDatagram(str.toUtf8(), QHostAddress("127.0.0.1"), quint16(6666));}void udpWid::ReceData(){    char buf[1024] = {0};    QHostAddress addr;    quint16 port;    m_UdpSocket->readDatagram(buf, sizeof(buf));    m_ReceText->setText(QString(buf));}

注:两个窗口的代码基本一致

udpwidopp.h

#ifndef UDPWIDOPP_H#define UDPWIDOPP_H#include <QWidget>#include <QPushButton>#include <QTextEdit>#include <QUdpSocket>class udpWidOpp : public QWidget{    Q_OBJECTpublic:    explicit udpWidOpp(QWidget *parent = 0);    ~udpWidOpp();     void initWidget();private slots:     void sendData();     void ReceData();private:    QPushButton *m_SendButton;    QPushButton *m_CloseButton;    QTextEdit *m_SendText;    QTextEdit *m_ReceText;    QUdpSocket *m_UdpSocket;};#endif // UDPWID_H

udpwidopp.cpp

#include "udpwidopp.h"#include "ui_udpwid.h"#include <QHBoxLayout>#include <QVBoxLayout>#include <QHostAddress>#include <QDebug>udpWidOpp::udpWidOpp(QWidget *parent) :    QWidget(parent){    initWidget();    m_UdpSocket = new QUdpSocket(this);    m_UdpSocket->bind(6666);    connect(m_UdpSocket, SIGNAL(readyRead()), this, SLOT(ReceData()));    connect(m_SendButton, SIGNAL(pressed()), this, SLOT(sendData()));}udpWidOpp::~udpWidOpp(){}void udpWidOpp::initWidget(){    this->resize(800,600);    this->setWindowTitle("ClientOppWidget_port:6666");    QVBoxLayout *VLayoutText = new QVBoxLayout(this);    VLayoutText->setMargin(4);    QWidget *TextWidget = new QWidget(this);    TextWidget->setLayout(VLayoutText);    m_ReceText = new QTextEdit(TextWidget);    m_ReceText->setReadOnly(true);    m_SendText = new QTextEdit(TextWidget);    m_SendText->setMaximumHeight(100);    VLayoutText->addWidget(m_ReceText);    VLayoutText->addWidget(m_SendText);    QHBoxLayout *HLayoutButton = new QHBoxLayout(this);    HLayoutButton->setMargin(4);    QWidget *ButtonWidget = new QWidget(this);    ButtonWidget->setLayout(HLayoutButton);    m_SendButton = new QPushButton(this);    m_SendButton->setText(QString("Send").toUtf8().data());    m_CloseButton = new QPushButton(this);    m_CloseButton->setText(QString("Close").toUtf8().data());    HLayoutButton->addWidget(m_SendButton);    HLayoutButton->addStretch();    HLayoutButton->addWidget(m_CloseButton);    QVBoxLayout *VLayoutMain = new QVBoxLayout(this);    VLayoutMain->setMargin(2);    this->setLayout(VLayoutMain);    VLayoutMain->addWidget(TextWidget);    VLayoutMain->addWidget(ButtonWidget);}void udpWidOpp::sendData(){    QString str = m_SendText->toPlainText();    m_SendText->clear();    m_UdpSocket->writeDatagram(str.toUtf8(), QHostAddress("127.0.0.1"), quint16(5555));}void udpWidOpp::ReceData(){    char buf[125] = {0};    QHostAddress addr;    quint16 port;    m_UdpSocket->readDatagram(buf, sizeof(buf), &addr, &port);    m_ReceText->setText(QString(buf));}

main函数

#include "udpwid.h"#include "udpwidopp.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    udpWid w;    w.show();    udpWidOpp wo;    wo.show();        return a.exec();}