2013-08-12 3 views
1

Я пытаюсь реализовать простой ответ сервера в Perspective Broker.Реализация ссылочных объектов на стороне клиента с Twisted Perspective Broker

Возможная реализация (пожалуйста, предложите другим, если это возможно):

Клиент запрашивает сервер выполнить метод сервера, сервер выполняет затем отвечает (выполнив метод клиента, единственной целью которой является печать сообщение):

[Client-side]: 

class ClientPrint(pb.Referenceable): 
    def remote_clientprint(self, message): 
     print "Printing the message from the server: ", message 

[Server-side]: 

class RootServerObject(pb.Root): 
    def remote_OneFunc(self, ...): 
     ... 
     print "Now sending the reply..." 
     *get ClientPrint object?* 
     clientprintobj.callRemote("clientprint", "this is the reply!") 

Как я могу реализовать захват объектов на стороне клиента? Есть ли лучший способ реализовать ответы сервера, чем захват объекта на стороне клиента и вызов метода клиента только для печати?

Вот полный код, где я пытаюсь реализовать ответы:

[Клиентский]:

from twisted.internet import reactor 
from twisted.spread import pb 

class Client(): 
    def __init__(self, addr, port, spec): 
     self.addr = None 
     self.port = None 
     self.SomeData = None 

    def connect(self, addr, port): 
     factory = pb.PBClientFactory() 
     reactor.connectTCP(addr, port, factory) 
     def1 = factory.getRootObject() 
     def1.addCallbacks(self.got_obj, self.err_obj) 

    def got_obj(self, rootsrvobj): 
     print "Got root server obj:", rootsrvobj 
     self.server = rootsrvobj 
     def2 = self.server.callRemote("SomeFunc", SomeData) 

    def err_obj(self, reason): 
     print "Error getting root server obj:", reason 
     self.quit() 

def cmdsub(addr, port, SomeData): 
    c = Client(addr, port, SomeData) 
    c.connect(addr, port) 

[Серверный]:

class RootServerObject(pb.Root): 
    def __init__(self): 
     self.DataOut = None 

    def remote_SomeFunc(self, SomeData): 
     self.DataOut = hash(SomeData) 
     print "Now sending reply..." 
     *implement a reply?* 

Возможно, являются более продвинутыми функциями Twisted (или Twisted PB), которые сделают это более простым.

Документация: https://twistedmatrix.com/documents/12.3.0/core/howto/pb-usage.html#auto3

Спасибо.

ответ

0

Самый простой способ сделать это - взять на себя клиентский объект, который сервер должен использовать и передать его серверу. Почти любое решение, о котором я могу думать, имеет это в своей основе.

Изменение got_obj метод вашего клиента, чтобы быть чем-то больше, как это:

def got_obj(self, rootsrvobj): 
    print "Got root server obj:", rootsrvobj 
    self.server = rootsrvobj 
    def2 = self.server.callRemote("SomeFunc", self, SomeData) 

И изменить реализацию remote_SomeFunc быть что-то больше, как это:

def remote_SomeFunc(self, client, SomeData): 
    self.DataOut = hash(SomeData) 
    print "Now sending reply..." 
    client.callRemote("client_print", "Here is your reply") 

Вы могли бы хотеть исследовать Twisted Cred, как более структурированный способ управления ссылками на ваш клиентский объект, но cred просто основывается на этой точной функции Perspective Broker, чтобы предоставить более абстрактный, более функциональный интерфейс.

Однако, заметьте, что я сказал «почти» выше ...

Имейте в виду, что реализация витыми по Perspective Broker имеет хорошо интегрирована поддержка Deferreds. Если метод remote_ возвращает Deferred, тогда никакой ответ не будет отправлен вызову метода до тех пор, пока не погаснет Deferred, а затем результат будет отправлен в результате вызова метода. Вы могли бы рассмотреть вопрос о создании логики client_print в обратного вызова на Deferred возвращенный self.server.callRemote("SomeFunc", SomeData) и делают сервер remote_SomeFuncвозврата ответа, либо синхронно или асинхронно (как Deferred).

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