我希望在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模块的代码... 请为我解释一下 并给我建议任何client.getting ID和其他东西的ID 你知道,我有一个服务器和两个客户端,一个客户端运行一个简单的PyQt程序,获得一个maya python命令,点击它的按钮,我想在maya上运行的客户端2上运行命令,好吗?但是,我想将两个客户端连接在一起,并将它们的方法作为点对点连接相互调用。但我不知道如何从client1(PyQt)调用客户端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()
Client1(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()
Client2(maya):
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)
答案 0 :(得分: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的客户端,要么假设某种广播机制(服务器将命令发送给所有客户端)。