Qt实现UDP通信简例

参考

QT实现UDP通信(原版例子!!!)
Singals & Slots(官方文档)
Qt入门之信号与槽机制
Qt 信号槽的实现
Qt学习 之 Socket通信
Qt的Socket数据通讯的一个例子
Qt 下的udp socket通信示例(要下载的完整Qt工程)
CSDN-markdown语法之如何插入图片(乱入…)

目标

终极目标是完成计网课设:基于P2P的局域网即时通信系统
然而…第一次接触 Qt,完全没有概念,希望有个尽量简单的例子见识一下 Qt 网络编程的套路。看完参考的例子后学写了一波。

特点

  • 只有一边发送、另一边接收,且都在本地
  • 没有图形界面,就黑框框

Tips

  • Qt 版本:5.8
  • .pro 文件里要加一句:QT += network,接着一定要 执行qmake
  • 约定用 2333 号端口(随便啦)
  • 测试时要在本机启动两个程序,就把发送端和接收段放在两个工程里,分别置为活动工程、运行,就可以启动两个了
  • singals 和 slots 其实就是普通的成员函数,见上面 Qt 信号槽的实现 的链接中带有魔法的宏
  • bind() 大概是使用那个端口的意思,就从那端口读数据
  • 一旦端口收到数据,就会emit一个叫readyRead()的信号,然后那些connect()readyRead()的槽(例中的receive())就会收到通知(被调用),然后进行相应的操作(函数体)

源码

发送端

main.cpp

#include <QByteArray>
#include <QCoreApplication>
#include <QHostAddress>
#include <QUdpSocket>

const quint16 PORT = 2333;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QUdpSocket qus;
//  qus.bind(QHostAddress("127.0.0.1"), PORT+1);
    QByteArray msg = "Hello world!";
    std::cout << "--- Sender ---" << std::endl;
    for(int i=0; i<100; ++i)
        qus.writeDatagram(msg, QHostAddress("127.0.0.1"), PORT);

    return a.exec();
}

接收端

UdpReceiver.h

#ifndef UDPRECEIVER_H
#define UDPRECEIVER_H

#include <QObject>
#include <QUdpSocket>

class UdpReceiver : public QObject
{
    Q_OBJECT

public:
    UdpReceiver(QObject *p = 0);
    ~UdpReceiver();

public slots:
    void receive();

private:
    QUdpSocket *uSocket;
};

#endif // UDPRECEIVER_H

UdpReceiver.cpp

#include <QByteArray>
#include <iostream>
#include "UdpReceiver.h"

const quint16 PORT = 2333;

UdpReceiver::UdpReceiver(QObject *p) :
    QObject(p)
{
    uSocket = new QUdpSocket;
    uSocket->bind(QHostAddress("127.0.0.1"), PORT);
    connect(uSocket, SIGNAL(readyRead()), this, SLOT(receive()));
}

UdpReceiver::~UdpReceiver()
{
    delete uSocket;
}

void UdpReceiver::receive()
{
    QByteArray ba;
    while(uSocket->hasPendingDatagrams())
    {
        ba.resize(uSocket->pendingDatagramSize());
        uSocket->readDatagram(ba.data(), ba.size());
        std::cout << ba.data() << std::endl;
    }
}

main.cpp

#include <QCoreApplication>
#include "udpreceiver.h"
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    UdpReceiver ur;
    std::cout << "--- Recevier ---" << std::endl;

    return a.exec();
}

截图

工程

工程截图

qmake

qmake

效果

效果图

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值