Qt リモートオブジェクト - 外部 QIODevices

外部 QIODevices

Qt Remote Objects は、QTcpServerQTcpSocket のペアのような、いくつかの通信チャンネルをすぐにサポートします。tcp の場合はQUrl を、QLocalServerQLocalSocket の場合は を指定すると、リッスンや接続に必要なコードは定型文となり、Qt 内部で処理されます。Qt Remote Objectsは他のタイプのQIODevice もサポートしており、QRemoteObjectNode クラスはカスタムコードが必要なケースをサポートする追加メソッドを提供しています。

TCP/IPを使った例を以下に示します。より現実的な例ではSSL接続を使用し、証明書などの設定が必要になります。

// Create the server and listen outside of QtRO
QTcpServer tcpServer;
tcpServer.listen(QHostAddress(QStringLiteral("127.0.0.1")), 65213);

// Create the host node.  We don't need a hostUrl unless we want to take
// advantage of external schemas (see next example).
QRemoteObjectHost srcNode;

// Make sure any connections are handed to QtRO
QObject::connect(&tcpServer, &QTcpServer::newConnection, &srcNode,
                 [&srcNode, &tcpServer]() {
    srcNode.addHostSideConnection(tcpServer.nextPendingConnection());
});

Replica側のコードは手動でHostに接続する必要があります。

QRemoteObjectNode repNode;
QTcpSocket *socket = new QTcpSocket(&repNode);
QObject::connect(socket, &QTcpSocket::connected, &repNode,
        [socket, &repNode]() {
    repNode.addClientSideConnection(socket);
});
socket->connectToHost(QHostAddress(QStringLiteral("127.0.0.1")), 65213);

外部スキーマ

上記のように、QIODevice の各サイドを作成し、QRemoteObjectNode::addClientSideConnection(QIODevice *ioDevice)とQRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)を呼び出すことが可能です。これは完全にサポートされていますが、クライアントが接続を確立する方法を知っているか、その情報を発見する方法を持っている必要があります。これはまさにレジストリが解決するために設計された問題です。

Qtリモートオブジェクトでは、レジストリで「外部スキーマ」を使用することもできます。QRemoteObjectHost 、ユーザはhostUrlに希望のスキーマを設定します。

// Use standard tcp url for the registry
const QUrl registryUrl = QUrl(QStringLiteral("tcp://127.0.0.1:65212"));
// Use "exttcp" for the "external" interface
const QUrl extUrl = QUrl(QStringLiteral("exttcp://127.0.0.1:65213"));

// Create the server and listen outside of QtRO
QTcpServer tcpServer;
tcpServer.listen(QHostAddress(extUrl.host()), extUrl.port());

// We need a registry for everyone to connect to
QRemoteObjectRegistryHost registry(registryUrl);

// Finally, we create our host node and register "exttcp" as our schema.
// We need the AllowExternalRegistration parameter to prevent the node from
// setting a hostUrlInvalid error.
QRemoteObjectHost srcNode(extUrl, registryUrl, QRemoteObjectHost::AllowExternalRegistration);
// From now on, when we call enableRemoting() from this node, the registry
// will be updated to show the Source object at extUrl.

Replica側では、QRemoteObjectNode 、外部スキーマが検出されたときに使用するコールバックを登録する必要があります。コールバックはRemoteObjectSchemaHandler でなければなりません。

// Use standard tcp url for the registry
const QUrl registryUrl = QUrl(QStringLiteral("tcp://127.0.0.1:65212"));

// This time create the node connected to the registry
QRemoteObjectNode repNode(registryUrl);

// Create the RemoteObjectSchemaHandler callback
QRemoteObjectNode::RemoteObjectSchemaHandler setupTcp = [&repNode](QUrl url) {
    QTcpSocket *socket = new QTcpSocket(&repNode);
    connect(socket, &QTcpSocket::connected,
            [socket, &repNode]() {
        repNode.addClientSideConnection(socket);
    });
    connect(socket, &QSslSocket::errorOccurred,
            [socket](QAbstractSocket::SocketError error) {
        delete socket;
    });
    socket->connectToHost(url.host(), url.port());
};

// Once we call registerExternalSchema, the above method will be called
// whenever the registry sees an object we are interested in on "exttcp"
repNode.registerExternalSchema(QStringLiteral("exttcp"), setupTcp);

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。