QUdpSocket通信简易实例

QUdpSocket通信简易实例

为了避免千篇一律,在本文中我只介绍我在使用QUdpSocket的使用体会,作为一个备忘录。
Udp通信和Tcp最大的不同就是基于无连接的通信,有点像是村里面的广播,我在广播里面说话,你不一定听到了(你可能带着耳机在听歌),但是我默认你听到了(毕竟我说的那么大声,而且还是全村的广播)。所以和Tcp通信,在应用层次的感受就是,以往Tcp可能有Server以及Client主次之间的区别,原因主要是因为建立连接的主次之分;而Udp就没有服务器和客户端之前的差别,大家都可以在广播里面说话,也都可以在家里听广播,所以只有Sender以及Reciver的区别。下面是关于QUdpSocket通信简易实例代码,分为Sender以及Reciver:

Sender:

由于是简易实例,设置成为发送一条消息就退出:
QT工程的pro文件中添加

QT += network

UdpSenderCmd.h

#ifndef UDPSENDERCMD_H
#define UDPSENDERCMD_H

#include "QPushButton"
#include "QLineEdit"
#include <QWidget>
#include <QUdpSocket>

class SendWIdgetCmd
{
public:
    SendWIdgetCmd();
    ~SendWIdgetCmd();
     void slo_sendMessge(std::string param);


private:
    QUdpSocket * sender;
};
#endif // UDPSENDERCMD_H

UdpSenderCmd.cpp

#include "UdpSenderCmd.h"

#include <QHBoxLayout>
#include <QTextCodec>

SendWIdgetCmd::SendWIdgetCmd()
{
    // 初始化
      sender = new QUdpSocket();
}

SendWIdgetCmd::~SendWIdgetCmd()
{
    delete sender;
}

void SendWIdgetCmd::slo_sendMessge(std::string param)
{
    QString string = QString::fromStdString(param);
    // 获取输入的内容
    qDebug() << string;
    /*发送数据
     * 第一个参数:要发送的内容,这里是要发送输入框的内容,
     *             参数没有QString类型,需要转换为QByteArray类型或Char*类型
     * 第二个参数:要发送到的目标IP地址,这里是本机测试,所以用LocalHost
     * 第三个参数:要发送的的目标端口,自己随意指定
     * 返回值:发送成功返回发送的字节数,失败返回-1
     */
    int w = sender->writeDatagram(string.toLocal8Bit(),QHostAddress::LocalHost,8179);
    // 判断是否发送成功
    if(w == -1)
    {
        qDebug() << "发送失败!";
    }
    else
    {
        qDebug() << "发送成功,字节数:" << w;
    }
}

main.cpp

#include"UdpSenderCmd.h"
int main(int argc, char *argv[])
{
     SendWIdgetCmd s;
     std::string msg = "this is a test message";
     s.slo_sendMessge(msg);

}

Reciver:

由于Reciver需要循环等待,可以使用QT提供的信号与槽函数完美契合,所以代码会些微的复杂一些
值得注意的是需要在工程中的pro文件中添加:

QT += network
QT +=widgets

UdpReciver.h

#ifndef UDPRECIVER_H
#define UDPRECIVER_H

#include <QWidget>
#include <QPlainTextEdit>
#include <QUdpSocket>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void slo_receiveMeaage();

private:
    QPlainTextEdit * showMessage;

    QUdpSocket * receiver;

};
#endif // UDPRECIVER_H

UdpReciver.cpp

#include "UdpReciver.h"

#include <QDebug>
#include <QTextCodec>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 创建显示消息的文本框
    showMessage = new QPlainTextEdit(this);
    // 设置文本框只读
    showMessage->setReadOnly(true);
    // 设置文本框初始大小
    showMessage->resize(300,200);

    // 创建UDP套接字
    receiver = new QUdpSocket(this);
    // 绑定接收信息的IP和端口
    receiver->bind(QHostAddress::LocalHost,8179);

    // 关联readyRead信号(每当有新的数据可以从设备的当前读取通道读取时,这个信号就会发出一次)
    connect(receiver,&QUdpSocket::readyRead,this,&Widget::slo_receiveMeaage);
}

Widget::~Widget()
{
    delete showMessage;
    delete receiver;
}

void Widget::slo_receiveMeaage()
{
    // 用于存储接收到的数据
    QByteArray message;

    // 循环读取接收的数据,如果至少有一个数据报等待读取,些函数返回 true,否则返回 false。
    while (receiver->hasPendingDatagrams())
    {
        // 动态设置大小为第一个挂起的 udp 数据包的大小
        message.resize(receiver->pendingDatagramSize());
        /* 接收数据
         * 第一个参数:存储接收到数据
         * 第二个参数:接收的数据最大的大小
         * 返回值:成功返回接收的数据字节数,失败返回-1
         */
        int r = receiver->readDatagram(message.data(),message.size());
        // 判断是否接收成功
        if(r == -1)
        {
            qDebug() << "接收数据失败";
        }
        else
        {
            qDebug() << "接收数据成功";
        }
    }
    //指定编码方式,否则如果数据中出现中文,会出现乱码情况
    QTextCodec *codec = QTextCodec::codecForName("GBK");
    QString string = codec->toUnicode(message);
    qDebug() << string;
    // 将编码后的数据显示到文本框中
    showMessage->appendPlainText(string);
}

main.cpp

#include <QApplication>
#include "UdpSender.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    SendWIdget s;
    s.setWindowTitle("send");
    s.show();

    return a.exec();
}

运行截图:
运行截图
懒得搞得这里有现成的资源:
UdpSender
UdpReciver

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来日可期1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值