Spec-Zone.ru › Qt

Qt Удалённые объекты — Внешние QIODevices

Внешние QIODevices

Qt Удалённые объекты поддерживает несколько каналов связи «из коробки», такие как пара QTcpServer и QTcpSocket. Указав необходимую QUrl для TCP или имя (для пары QLocalServer и QLocalSocket), код для прослушивания и подключения является стандартным и обрабатывается Qt внутри. Qt Удалённые объекты поддерживает и другие типы 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 должна вручную подключиться к Хосту

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);

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtremoteobjects-external-schemas.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API