Qt实现UDP通信简例

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/HackerTom/article/details/73530845

参考

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

效果

效果图

展开阅读全文

没有更多推荐了,返回首页