我有一个简单的' 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是一个实现可复制的简单类:来自twisted.spread导入pb
class aClass(pb.Copyable):
pass当我运行上面的代码时,我得到了以下错误: twisted.spread.jelly.InsecureJelly:内置是不允许的(类型为)
实际上,对象被发送到服务器时没有任何问题,因为它在服务器端使用pb.setUnjellyableForClass(aClass,RemoteClass)进行了安全保护,但是一旦返回到客户端,就会引发错误。
我正在寻找一种在两个对等点之间发送/接收我的对象的简单方法。
发布于 2012-01-25 16:07:44
透视图代理在通过网络讨论类时按名称标识类。类的名称部分来自定义它的模块。在从命令行运行的文件中定义类(即“主脚本”)的一个棘手问题是,它们可能以一个令人惊讶的名称结束。当你这样做时:
python foo.pyPython给foo.py中的代码取的模块名并不像人们所期望的那样是"foo"。相反,它类似于"__main__" (这就是为什么if __name__ == "__main__":技巧奏效的原因)。
但是,如果您的应用程序的其他部分稍后尝试从foo.py导入某些内容,那么Python将重新评估的内容,以创建一个名为"foo"的新模块。
此外,在一个进程的"__main__"模块中定义的类可能与另一个进程的"__main__"模块中定义的类无关。在您的示例中,__main__.RemoteClass是在服务器进程中定义的,但是客户端进程的__main__模块中没有RemoteClass。
因此,PB被混淆了,无法完成对象的传输。
解决方案是尽量减少主脚本中的代码数量,特别是不要用名称(没有类,没有函数定义)来定义东西。
然而,另一个问题是期望一个RemoteCopy可以在PB上发送而不需要额外的准备。可以发送Copyable,在对等点上创建RemoteCopy,但这不是对称关系。您的客户端还需要通过发出类似(或不同)的pb.setUnjellyableForClass调用来允许这一点。
https://stackoverflow.com/questions/9005615
复制相似问题