gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:45:20 30 4
gpt4 key购买 nike

我想在 RPyC 中的两个客户端和一个服务器之间建立连接,我想从客户端 1 调用服务器的方法,在服务器的方法中调用客户端 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 命令并单击其按钮我想在客户端 2 上运行命令,该命令在 maya 上运行,好吗?但是,我想将两个客户端连接在一起,并作为对等连接相互调用它们的方法。但是我不知道如何从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)

最佳答案

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

添加一行来实例化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 的客户端,或者您假设某种广播机制(服务器将它接收到的命令发送给所有客户端)。

关于python - 在 RPyC 中如何获取连接到服务器的客户端列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21288655/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com