Чем отличаются QRemoteObjectRegistryHost и QRemoteObjectHost? - PullRequest
1 голос
/ 07 января 2020

Я новичок в изучении QRemoteObjects, я понимаю использование Прямое соединение с Dynami c Реплика . Но я не понимаю Соединения с удаленными узлами с использованием реестра механизм. Я запутался в отношениях между QRemoteObjectRegistryHost, QRemoteObjectHost, QRemoteObjectNode и QRemoteObjectReplica, кто-нибудь может дать мне простое объяснение?

В методе реестра
код использования сервера как этот

regNode = QRemoteObjectRegistryHost(QUrl('local:registry'))
srcNode = QRemoteObjectHost(QUrl('local:replica'), QUrl('local:registry'))
#is there will create two Local Socket  server?

использование клиента

repNode = QRemoteObjectNode(QUrl('local:registry'))

В чем разница QUrl('local:registry') и QUrl('local:replica')?
И я думаю, QRemoteObjectHost(QUrl('local:replica'), QUrl('local:registry')) избыточен в этом методе .

1 Ответ

1 голос
/ 08 января 2020

В приведенном вами примере преимущество не наблюдается, и, следовательно, вы видите его избыточным.

В некоторых приложениях необходимо иметь несколько источников, и репликам будет необходимо подключиться к репликам. каждый источник, поэтому задача QRemoteObjectRegistryHost состоит в том, чтобы иметь точку подключения для нескольких источников и чтобы реплики подключались через нее.

Например, следующая схема показывает ее использование:

 ┌-------------------┐                ┌-------------------┐
 | QRemoteObjectHost |                | QRemoteObjectHost |
 └--------┬----------┘                └-------┬-----------┘
          |                                   |
          |                                   |
     ┌----┴-----------------------------------┴----┐ 
     |          QRemoteObjectRegistryHost          |
     └--┬-------------------┬-----------------┬----┘
        |                   |                 |
        |                   |                 |
┌-------┴----- ---┐ ┌-------┴---------┐ ┌-----┴------- ---┐
|QRemoteObjectNode| |QRemoteObjectNode| |QRemoteObjectNode|
└-----------------┘ └-----------------┘ └-----------------┘

Несколько узлов могут быть зарегистрированы через QRemoteObjectHost, а QRemoteObjectHost зарегистрирован в QRemoteObjectRegistryHost, так что любой QRemoteObjectNode может получить реплики QRemoteObjectHost узлов через QRemoteObjectRegistryHost.

В Для иллюстрации функциональности я создал следующий пример:

├── register.py
├── replica.py
└── source.py

register.py

from PyQt5 import QtCore, QtRemoteObjects


if __name__ == "__main__":
    import sys

    app = QtCore.QCoreApplication(sys.argv)

    regNode = QtRemoteObjects.QRemoteObjectRegistryHost(
        QtCore.QUrl("tcp://127.0.0.1:5557")
    )

    sys.exit(app.exec_())

replica.py

from functools import partial
import sys

from PyQt5 import QtCore, QtRemoteObjects


if __name__ == "__main__":

    app = QtCore.QCoreApplication(sys.argv)

    node = QtRemoteObjects.QRemoteObjectNode(QtCore.QUrl("tcp://127.0.0.1:5557"))

    replicas = []

    def on_remoteObjectAdded(info):
        name, url = info
        print("object added", name, url)
        replica = node.acquireDynamic(name)

        wrapper = partial(on_initialized, replica, name)
        replica.initialized.connect(wrapper)
        replicas.append(replica)

    node.registry().remoteObjectAdded.connect(on_remoteObjectAdded)

    def on_initialized(replica, name):
        wrapper = partial(print, name)
        replica.dataChanged.connect(wrapper)

    sys.exit(app.exec_())

source.py

import sys

from PyQt5 import QtCore, QtRemoteObjects


class Node(QtCore.QObject):
    dataChanged = QtCore.pyqtSignal(str)


if __name__ == "__main__":

    app = QtCore.QCoreApplication(sys.argv)

    parser = QtCore.QCommandLineParser()
    parser.addPositionalArgument("url", "Host URL different to tcp://127.0.0.1:5557")
    parser.addPositionalArgument("name", "Name of node")
    parser.process(app)
    args = parser.positionalArguments()

    if len(args) != 2:
        print("only url and name is required")
        sys.exit(-1)

    url, name = args

    if QtCore.QUrl("tcp://127.0.0.1:5557") == QtCore.QUrl(url):
        print("url different tcp://127.0.0.1:5557")
        sys.exit(-1)

    node = Node()
    srcNode = QtRemoteObjects.QRemoteObjectHost(
        QtCore.QUrl(url), QtCore.QUrl("tcp://127.0.0.1:5557")
    )
    srcNode.enableRemoting(node, name)

    def on_timeout():
        data = QtCore.QDateTime.currentDateTime().toString()
        node.dataChanged.emit(data)

    timer = QtCore.QTimer(interval=1000, timeout=on_timeout)
    timer.start()

    sys.exit(app.exec_())

Затем выполните следующие команды на разных CMD / терминалах:

python register.py
python replica.py
python source.py tcp://127.0.0.1:5558 node1
python source.py tcp://127.0.0.1:5559 node2

А в CMD / терминале консоль реплики a.py вы увидите следующее:

# ...
node1 Tue Jan 7 22:32:09 2020
node2 Tue Jan 7 22:32:09 2020
node1 Tue Jan 7 22:32:10 2020
node2 Tue Jan 7 22:32:10 2020
# ...
...