在 Twisted Perspective Broker 中使用引用对象进行客户端实现

51 阅读2分钟

在 Twisted Perspective Broker 中,我们需要实现一个简单的服务器回复。服务器执行客户端请求后,需要回复客户端(通过执行客户端方法,客户端方法的唯一目的是打印消息)。

huake_00063_.jpg [客户端]:

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

[服务器]:

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

问题是如何获取客户端对象?是否有更好的方法来实现服务器回复,而不是获取客户端对象并调用仅打印客户端方法?

  1. 解决方案

一种可能的解决方案是使用 Twisted 的 pb.Referenceable 类。pb.Referenceable 允许服务器在客户端上创建引用对象,客户端可以使用这些对象来调用服务器方法。

[客户端]:

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

def got_obj(rootsrvobj):
    print "Got root server obj:", rootsrvobj
    self.server = rootsrvobj
    def2 = self.server.callRemote("SomeFunc", SomeData)
    # 创建引用对象
    clientprintobj = ClientPrint()
    # 将引用对象发送到服务器
    rootsrvobj.callRemote("setClientPrint", clientprintobj)

[服务器]:

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

    def remote_SomeFunc(self, SomeData):
        self.DataOut = hash(SomeData)
        print "Now sending reply..."
        # 获取引用对象
        self.clientprintobj.callRemote("clientprint", "this is the reply!")

    def remote_setClientPrint(self, clientprintobj):
        self.clientprintobj = clientprintobj

这种解决方案允许服务器在客户端上创建引用对象,客户端可以使用这些对象来调用服务器方法。服务器可以使用这些引用对象来回复客户端。

另一种可能的解决方案是使用 Twisted 的 pb.Copyable 类。pb.Copyable 允许服务器将对象复制到客户端,客户端可以使用这些对象来调用服务器方法。

[客户端]:

def got_obj(rootsrvobj):
    print "Got root server obj:", rootsrvobj
    self.server = rootsrvobj
    def2 = self.server.callRemote("SomeFunc", SomeData)
    # 将对象复制到客户端
    rootsrvobj.callRemote("setClientPrint", ClientPrint())

[服务器]:

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

    def remote_SomeFunc(self, SomeData):
        self.DataOut = hash(SomeData)
        print "Now sending reply..."
        # 将对象复制到客户端
        self.clientprintobj.callRemote("clientprint", "this is the reply!")

    def remote_setClientPrint(self, clientprintobj):
        self.clientprintobj = clientprintobj

这种解决方案允许服务器将对象复制到客户端,客户端可以使用这些对象来调用服务器方法。服务器可以使用这些对象来回复客户端。

这两种解决方案都允许服务器在客户端上创建或复制对象,客户端可以使用这些对象来调用服务器方法。服务器可以使用这些对象来回复客户端。