Qt实现UDP通信简例

来源:互联网 发布:linux 安装vnc server 编辑:程序博客网 时间:2024/06/01 09:30

  • 参考
  • 目标
  • 特点
  • Tips
  • 源码
    • 发送端
      • maincpp
    • 接收端
      • UdpReceiverh
      • UdpReceivercpp
      • maincpp
  • 截图
    • 工程
    • qmake
    • 效果

参考

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_OBJECTpublic:    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

效果

效果图

原创粉丝点击