如何在 RPyC 中获取连接到服务器的客户端列表?

Posted

技术标签:

【中文标题】如何在 RPyC 中获取连接到服务器的客户端列表?【英文标题】:How can I get the list of clients connected to a server in RPyC? 【发布时间】:2014-01-22 16:35:16 【问题描述】:

我想在 RPyC 中建立两个客户端和一个服务器之间的连接,我想从 client1 调用服务器的方法,在服务器的方法中调用客户端 2 的方法,这是我的代码:

import rpyc
#server:
class ServerService(rpyc.Service):
    def on_connect(self):
        print "Connected To Server\n"
    def on_disconnect(self):
        print "Disconnected From Server\n"
    def exposed_command(self, cmd):
        self._cmd = cmd
        self._conn.root.run_command(self._cmd)
#client1:
class AppService(rpyc.Service):
    def exposed_foo():
        return "foo"
conn = rpyc.connect("localhost", 2014, service = AppService)
conn.root.command(self._cmd)
#client2:
class ClientService(rpyc.Service):
    def exposed_run_command(self, cmd):
        eval(cmd)
# connect to server
conn = rpyc.connect("localhost", 2014, service = ClientService)

我有 3 个单独的文件,我想通过服务器连接 2 个客户端。

更新

我尝试更多地解释我的情况并添加我使用的 3 模块的代码... 请为我解释更多 并给我关于任何客户 ID 的建议。获取 ID 和其他东西 你知道,我有一个服务器和两个客户端,一个客户端运行一个简单的 PyQt 程序,该程序获取一个 maya python 命令并单击它的按钮,我想在运行在 maya 上的客户端 2 上运行命令,好吗?但是,我想将两个客户端连接在一起,并将它们的方法作为对等连接相互调用。但我不知道如何从client1(PyQt)调用client 2(maya)的run_command

服务器端:

import rpyc    
class ServerService(rpyc.Service):
    def on_connect(self):
        print "Connected To Server\n"    
    def on_disconnect(self):
        print "Disconnected From Server\n"    
    def exposed_command(self, cmd):
        self._cmd = cmd
        self._conn.root.run_command(self._cmd)   

if __name__ == "__main__":
    from rpyc.utils.server import ThreadedServer
    t = ThreadedServer(ServerService, port = 2014)
    print "Server is ready ..."
    t.start()

客户端1(PyQt):

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import rpyc
class ClientApp(QDialog):
    def __init__(self, parent = None):
        super(ClientApp, self).__init__(parent)

        self.label = QLabel("CMD: ")
        self.textBox = QLineEdit()
        self.button = QPushButton("Run Command")    
        layout = QHBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.textBox)
        layout.addWidget(self.button)    
        self.setWindowTitle("Client App")
        # SIGNALS
        self.button.clicked.connect(self.sendCommand)           
        self._cmd = str(self.textBox.text())
        self.sendCommand()    
    def sendCommand(self):
        print "Printed Command : "
        self._cmd = str(self.textBox.text())
        conn.root.command(self._cmd)    
class AppService(rpyc.Service):
    def exposed_foo2():
        return "foo2"    
conn = rpyc.connect("localhost", 2014, service = AppService)    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ClientApp()
    window.show()

客户端2(玛雅):

import rpyc
from maya import cmds    
class ClientService(rpyc.Service):
    def exposed_run_command(self, cmd):
        eval(cmd)    
# connect to server
conn = rpyc.connect("localhost", 2014, service = ClientService)

【问题讨论】:

【参考方案1】:

这里有一些问题需要解决:

添加一行来实例化ServerService。假设您已经拥有它但没有显示它(请更新您的问题),那么以下可能适用。

conn.root.command(self._cmd) 行不是对象的一部分,它是客户端 1 脚本的一部分,因此“self”不指代任何东西。这应该类似于conn.root.command("run_command")

然后在您的 ServerService.exposed_command(self, cmd) 中,应该收到 cmd = "run_command"。打印出来确认一下。

然后在 ServerService.exposed_command(self, cmd) 中,你有

self._conn.root.run_command(self._cmd)

我使用 rpyc 已经有一段时间了,所以我不再熟悉它的细节,但是它如何知道向哪个客户端发出命令?我猜客户端 2 要么必须有一个 ID,并且 ServerService 应该将命令发送到具有给定 ID 的客户端,或者您假设某种广播机制(服务器将它接收到的命令发送给所有客户端)。

【讨论】:

我认为最后一段可能是最相关的。看起来 OP 确实具有让一个客户端与服务器对话的基本概念。但是没有广播消息或将它们从一个特定客户端路由到另一个客户端的概念。

以上是关于如何在 RPyC 中获取连接到服务器的客户端列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用凭据连接到SharePoint列表使用客户端对象模型?

android系统如何管理连接到有界远程服务的客户端列表

获取连接到 Web 服务器的客户端的用户名

Python RPyC如何实现客户端与服务端通信

如何在 iOS 上获取外部屏幕列表并连接到

C# - 连接到 (RAS) *** 时如何获取 IP 地址