2014-01-22 2 views
3

Я хочу, чтобы иметь связь между двумя клиентом и одним сервером в RPyC, и я хочу, чтобы вызвать метод сервера из client1, что в способе сервера вызов метода клиента 2, это мой код:Как я могу получить список клиентов, подключенных к серверу в RPyC?

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 клиента по серверу.

Update

Я пытаюсь объяснить более мою ситуацию и добавить коды 3 модуля, который я использую ... , пожалуйста, объясните для меня больше и дать мне советы о ID любых идентификаторов client.getting и другие вещи вы знаете, у меня есть один сервер и два клиента, один клиент запускает простую программу PyQt, которая получает команду maya python и с нажатием на ее кнопке я хочу запустить команду на клиенте 2, которая запускается на майе, нормально ? Но я хочу связать оба клиента вместе и вызывать их методы друг от друга как одноранговое соединение. Но я не знаю, как назвать run_command от клиента 2 (майа) от client1 (PyQt)

сторона

Сервер:

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 (майа):

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, поэтому «я» не ссылается ни на что. Вероятно, это должно быть что-то вроде conn.root.command("run_command").

Затем в вашем сервере ServerService.exposed_command (self, cmd) следует получить cmd = "run_command". Распечатайте его, чтобы убедиться.

Тогда в ServerService.exposed_command (я, CMD), у вас есть

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

Это было время, так как я использовал RPyC, так что я не знаком с подробностями больше, но, как он знает какой клиент выдать команду? Я предполагаю, что клиент 2 должен иметь идентификатор, а ServerService должен отправить команду клиенту с заданным идентификатором или вы принимаете какой-то механизм вещания (где сервер отправляет команды, которые он получает всем клиентам).

+0

Я думаю, что последний абзац, вероятно, является наиболее актуальным. Похоже, что у ОП есть основные понятия о том, чтобы один клиент разговаривал с сервером. Но нет никакой концепции вещания сообщений или маршрутизации их от одного конкретного клиента к другому. – jdi

Смежные вопросы