Qt使用多线程进行UDP通信
UDP
- 由于要使用套接字,所以需要在服务器和客户端的工程文件中都添加QT += core gui network
- 使用writeDatagram方法传输数据,readDatagram方法接收数据。QT在调用writeDatagram方法时候会自动发出readyRead信号给接收方监听。
多线程
Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里,即使用MoveToThread。
Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。因此本文使用的是第二种方法。
第二种方法主要就是写一个一个继承于QObject的类,将耗时的工作写在该类的槽函数中。
然后将派生类对象移动到一个QThread中,该线程需要start。最后,通过信号连接派生类的槽函数,并通过信号触发槽函数。(槽函数在子线程中执行)。
不多说,直接上服务器代码
先把ui界面贴一下,其中label名字叫做label_tosend,按钮名字pushbutton_start。
以下是派生类的头文件
#ifndef TRAVEL_H
#define TRAVEL_H
#include <QObject>
#include <QDebug>
#include <QString>
#include <QUdpSocket>
class travel : public QObject
{
Q_OBJECT
public:
explicit travel(QObject *parent = nullptr);
~travel();
signals:
void sig_ok();
public slots:
void slot_do(QString msg,int port);
//主要实现功能的函数,用于传送数据给客户端,其中两个传入参数分别是待传数据和客户端端口号
private:
QUdpSocket *mudpsocket;
};
#endif // TRAVEL_H
接下来是traval.cpp
#include "travel.h"
#include <QUdpSocket>
#include <QThread>
travel::travel(QObject *parent) : QObject(parent)
{
qDebug()<<"构造了travel";
mudpsocket=new QUdpSocket(this);//新建一个UDP套接字
}
travel::~travel()