Qt リモートオブジェクト - 外部 QIODevices
外部 QIODevices
Qt Remote Objects は、QTcpServer とQTcpSocket のペアのような、いくつかの通信チャンネルをすぐにサポートします。tcp の場合はQUrl を、QLocalServer とQLocalSocket の場合は を指定すると、リッスンや接続に必要なコードは定型文となり、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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。