使用Twisted Perspective Broker实现客户端的可引用对象

时间:2013-08-12 19:03:16

标签: python twisted perspective broker

我正在尝试在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

感谢。

1 个答案:

答案 0 :(得分: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的这个功能上,以提供更抽象,更有特色的界面。

然而,请注意我上面说“差不多”......

请记住,Twisted的Perspective Broker实现对Deferreds有很好的集成支持。如果remote_方法返回Deferred,则在Deferred触发之前,不会向方法调用发送任何响应,然后结果将作为方法调用的结果发送。您可以考虑将client_print的逻辑放在Deferred返回的self.server.callRemote("SomeFunc", SomeData)上的回调中,并使服务器的remote_SomeFunc 返回< / em>回复,同步或异步(作为Deferred)。