2017-08-02 142 views
0

我想开发一个远程一些自定义的QObject(实际上这个QObject访问某些数据库,并提出一些统计数据)的服务。为此我使用QtService和QtRemoteObject,当我在一个简单的QCoreApplication中托管远程对象时,一切都很好,我可以连接到主机并运行插槽或获取信号,但是当我在QtService上托管远程对象时应用程序,我无法连接到主机,起初我想过防火墙,所以我为应用程序添加了一个入站出站规则,但仍然不起作用。 代码有点大(serval文件),如果你需要它的任何部分,我会提供它。QtService和QtRemoteObject如何使然后工作togather

服务类:

#include <QtService> 
#include <QCoreApplication> 
#include <QRemoteObjectHost> 
#include "affairstatero.h" 

class AffairStateService : public QtService<QCoreApplication> 
{ 
public: 
    explicit AffairStateService(int argc, char** argv, const QString& name = "affair_state"); 

    // QtServiceBase interface 
protected: 
    void start() override; 
    void stop() override; 
    void pause() override; 
    void resume() override; 

private: 
    AffairStateRemoteObject* _affairStateRO; 
    QRemoteObjectHost* _remotingHost; 
}; 

CPP:

#include "affairstateservice.h" 
#include <QDebug> 
#include <QSqliteSettings> 

AffairStateService::AffairStateService(int argc, char **argv, const QString &name): 
    QtService(argc,argv,name) 
{ 
    this->setServiceDescription("report affair states."); 
    this->setServiceFlags(QtService::CanBeSuspended); 
    qDebug() << "service starting ..."; 
} 

void AffairStateService::start() 
{ 
    _affairStateRO = new AffairStateRemoteObject(); 
    _remotingHost = new QRemoteObjectHost(); 
    qInfo() << "Starting the service"; 
    QSqliteSettings settings; 
    qInfo() << "Settings filename " << settings.fileName() << settings.organizationName() << settings.applicationName(); 
    _affairStateRO->startTimer(); 
    _remotingHost->setHostUrl(QUrl(settings.value("endpoint").toString())); 
    _remotingHost->enableRemoting(_affairStateRO, "AffairStateRO"); 
    qInfo() << "Remoting on " << _remotingHost->hostUrl().toString(); 
    qInfo() << "Done"; 
} 

void AffairStateService::stop() 
{ 
    _affairStateRO->stopTimer(); 
    _remotingHost->disableRemoting(_affairStateRO); 
} 

void AffairStateService::pause() 
{ 
    _remotingHost->disableRemoting(_affairStateRO); 
} 

void AffairStateService::resume() 
{ 
    _remotingHost->enableRemoting(_affairStateRO); 
} 

信息:10的Windows/X64 - Qt的5.9.1 MCVS2017

回答

1

好吧,我会回答我的问题,这个问题在服务器端,我通过做QRemoteObjectHost::enableRemoting(&object,"Object");给远程对象命名,但在客户端,我只是购买了一个副本,而没有给出源名称,如QRemoteObjectNode::acquire<ObjReplica>();

我不知道到底是什么,但我想QtRemoteObject将远程对象设置为没有名称的默认对象,但是当命名远程对象时,我们需要获取同名的副本,甚至如果源只是远程处理一个对象。

当在服务器端远程处理的对象作为QRemoteObjectHost::enableRemoting(&obj, "Object");,在我们需要QRemoteObjectNode::acquire<ObjReplica>("Object");

它没有涉及到QtService客户端。

相关问题