一、什么是QtRO
Qt Remote Objects(QRO)是Qt提供的一种用于实现远程对象通信的机制。
QtRO支持两种类型的通信:RPC(远程过程调用)和LPC(本地进程通信)。
RPC(远程过程调用)包括以下几种类型:
基于HTTP协议的RPC:例如Dubbo、Thrift等。
基于二进制协议的RPC:例如GRPC、Hetty等。
基于TCP协议的RPC:例如RMI、Remoting等。
LPC包括基于共享内存的通信和基于消息传递的通信。
总的来说,QtRO类似于平时的socket通信、串口通信、信号槽通信。它最大的特点是集合了这些通信的功能,使得远端通信能与本机通信一样使用信号槽的方式来收发信息
最大的优点可以说是免去了平时自己创建client端和server端时需要每次创建通信线程,解析协议,分拣数据。这里不同的数据可以直接用不同的信号槽来完成,远端通信就像是同个软件中对象之间的通信一样方便。
二、使用QtRO编写服务端
2.1首先需要编写rep文件,rep文件中包含了通信之间定义的接口。具体说明见官方文档。
以下是我的文件interface.rep
class Interface
{
SIGNAL(sigMessage(QString msg)) //发送文本
SIGNAL(sigPixmap(QByteArray pix)) //发送图片
SIGNAL(sigFile(QByteArray data,QString fname)) //发送文件
SLOT(void onMessage(QString msg))
SLOT(void onPixmap(QByteArray pix))
SLOT(void onFile(QByteArray data,QString fname))
}
2.2在pro文件中添加remoteobjects模块,添加rep文件
QT += remoteobjects
REPC_SOURCE += interface.rep
2.3构建一次工程,在输出目录会找到rep_interface_source.h文件,把它复制到工程目录。在工程中新建一个CommonInterface类:
commoninterface.h
#ifndef COMMONINTERFACE_H
#define COMMONINTERFACE_H
commoninterface.cpp
#include "rep_interface_source.h"
class CommonInterface : public CommonInterfaceSource
{
Q_OBJECT
public:
explicit CommonInterface(QObject *parent = nullptr);
virtual void onMessage(QString msg) override;
virtual void onPixmap(QByteArray pix) override;
virtual void onFile(QByteArray data,QString fname) override;
void sendMsg(const QString &msg);
void sendPixmap(QByteArray pix);
void sendFile(QByteArray data,QString fname);
signals:
void sigReceiveMsg(const QString &msg);
void sigReceivePix(QByteArray pix);
void sigReceiveFile(QByteArray data,QString fname);
};
#endif // COMMONINTERFACE_H
#include "commoninterface.h"
CommonInterface::CommonInterface(QObject *parent) : CommonInterfaceSource(parent)
{
}
void CommonInterface::onMessage(QString msg)
{
emit sigReceiveMsg(msg);
}
void CommonInterface::onPixmap(QByteArray pix)
{
emit sigReceivePix(pix);
}
void CommonInterface::onFile(QByteArray data,QString fname)
{
emit sigReceiveFile(data,fname);
}
void CommonInterface::sendMsg(const QString &msg)
{
emit sigMessage(msg);
}
void CommonInterface::sendPixmap(QByteArray pix)
{
emit sigPixmap(pix);
}
void CommonInterface::sendFile(QByteArray data,QString fname)
{
emit sigFile(data,fname);
}
Qt Remote Objects(QRO)是Qt提供的一种用于实现远程对象通信的机制。
QtRO支持两种类型的通信:RPC(远程过程调用)和LPC(本地进程通信)。
RPC(远程过程调用)包括以下几种类型:
基于HTTP协议的RPC:例如Dubbo、Thrift等。
基于二进制协议的RPC:例如GRPC、Hetty等。
基于TCP协议的RPC:例如RMI、Remoting等。
LPC包括基于共享内存的通信和基于消息传递的通信。
总的来说,QtRO类似于平时的socket通信、串口通信、信号槽通信。它最大的特点是集合了这些通信的功能,使得远端通信能与本机通信一样使用信号槽的方式来收发信息
最大的优点可以说是免去了平时自己创建client端和server端时需要每次创建通信线程,解析协议,分拣数据。这里不同的数据可以直接用不同的信号槽来完成,远端通信就像是同个软件中对象之间的通信一样方便。
二、使用QtRO编写服务端
2.1首先需要编写rep文件,rep文件中包含了通信之间定义的接口。具体说明见官方文档。
以下是我的文件interface.rep
class Interface
{
SIGNAL(sigMessage(QString msg)) //发送文本
SIGNAL(sigPixmap(QByteArray pix)) //发送图片
SIGNAL(sigFile(QByteArray data,QString fname)) //发送文件
SLOT(void onMessage(QString msg))
SLOT(void onPixmap(QByteArray pix))
SLOT(void onFile(QByteArray data,QString fname))
}
2.2在pro文件中添加remoteobjects模块,添加rep文件
QT += remoteobjects
REPC_SOURCE += interface.rep
2.3构建一次工程,在输出目录会找到rep_interface_source.h文件,把它复制到工程目录。在工程中新建一个CommonInterface类:
commoninterface.h
#ifndef COMMONINTERFACE_H
#define COMMONINTERFACE_H
commoninterface.cpp
#include "rep_interface_source.h"
class CommonInterface : public CommonInterfaceSource
{
Q_OBJECT
public:
explicit CommonInterface(QObject *parent = nullptr);
virtual void onMessage(QString msg) override;
virtual void onPixmap(QByteArray pix) override;
virtual void onFile(QByteArray data,QString fname) override;
void sendMsg(const QString &msg);
void sendPixmap(QByteArray pix);
void sendFile(QByteArray data,QString fname);
signals:
void sigReceiveMsg(const QString &msg);
void sigReceivePix(QByteArray pix);
void sigReceiveFile(QByteArray data,QString fname);
};
#endif // COMMONINTERFACE_H
#include "commoninterface.h"
CommonInterface::CommonInterface(QObject *parent) : CommonInterfaceSource(parent)
{
}
void CommonInterface::onMessage(QString msg)
{
emit sigReceiveMsg(msg);
}
void CommonInterface::onPixmap(QByteArray pix)
{
emit sigReceivePix(pix);
}
void CommonInterface::onFile(QByteArray data,QString fname)
{
emit sigReceiveFile(data,fname);
}
void CommonInterface::sendMsg(const QString &msg)
{
emit sigMessage(msg);
}
void CommonInterface::sendPixmap(QByteArray pix)
{
emit sigPixmap(pix);
}
void CommonInterface::sendFile(QByteArray data,QString fname)
{
emit sigFile(data,fname);
}