我有一个简单的 'echo' PB 客户端和服务器,其中客户端向服务器发送一个对象,服务器将相同的对象回显给客户端:
客户端:
from twisted.spread import pb
from twisted.internet import reactor
from twisted.python import util
from amodule import aClass
factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8282, factory)
d = factory.getRootObject()
d.addCallback(lambda object: object.callRemote("echo", aClass()))
d.addCallback(lambda response: 'server echoed: '+response)
d.addErrback(lambda reason: 'error: '+str(reason.value))
d.addCallback(util.println)
d.addCallback(lambda _: reactor.stop())
reactor.run()
服务器:
from twisted.application import internet, service
from twisted.internet import protocol
from twisted.spread import pb
from amodule import aClass
class RemoteClass(pb.RemoteCopy, aClass):
pass
pb.setUnjellyableForClass(aClass, RemoteClass)
class PBServer(pb.Root):
def remote_echo(self, a):
return a
application = service.Application("Test app")
# Prepare managers
clientManager = internet.TCPServer(8282, pb.PBServerFactory(PBServer()));
clientManager.setServiceParent(application)
if __name__ == '__main__':
print "Run with twistd"
import sys
sys.exit(1)
aClass 是一个实现 Copyable 的简单类: from twisted.spread import pb
class aClass(pb.Copyable):
pass
当我运行上面的代码时,我得到这个错误:twisted.spread.jelly.InsecureJelly: Module builtin not allowed (in type builtin .RemoteClass)。
事实上,对象被发送到服务器没有任何问题,因为它在服务器端使用 pb.setUnjellyableForClass(aClass, RemoteClass) 进行保护,但是一旦它返回到客户端,就会引发该错误。
我正在寻找一种方法来获得一种在两个对等方之间发送/接收我的对象的简单方法。