在 Twisted Perspective Broker 中,我们需要实现一个简单的服务器回复。服务器执行客户端请求后,需要回复客户端(通过执行客户端方法,客户端方法的唯一目的是打印消息)。
[客户端]:
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!")
问题是如何获取客户端对象?是否有更好的方法来实现服务器回复,而不是获取客户端对象并调用仅打印客户端方法?
- 解决方案
一种可能的解决方案是使用 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
这种解决方案允许服务器将对象复制到客户端,客户端可以使用这些对象来调用服务器方法。服务器可以使用这些对象来回复客户端。
这两种解决方案都允许服务器在客户端上创建或复制对象,客户端可以使用这些对象来调用服务器方法。服务器可以使用这些对象来回复客户端。