如何运输扭曲的物体?

时间:2014-01-04 12:39:09

标签: python twisted transport

我知道“transport.write()”我可以传输字符串对象,但我想知道这是否可以传输其他类型的数据,比如python类对象? 如果有可能我该怎么做?

3 个答案:

答案 0 :(得分:3)

您可以设计一些任意的自定义协议,但使用已经存在的框架可能会更高效,例如google的protocol buffers允许您轻松定义有效的消息传递结构,并支持python已经

JSON是一个简单的替代品,很多人只是使用压缩的json对象,因为它很容易并且默认内置到python中,但结果很慢,有不可预测的大小工件(压缩通常比无压缩输出大很多小消息),并且是传输二进制数据的糟糕解决方案。

编辑:哦,是的,不要使用泡菜。

答案 1 :(得分:2)

您可以使用json序列化对象。几乎所有Python对象都是json可序列化的,如果没有,那么你可以编写自己的编码器解码器来处理它们。不要使用 eval 来解码输入。

答案 2 :(得分:-2)

传输层的作用是将数据写入物理连接。它处于较低的抽象级别,并且python类对象到字节的映射在协议栈的进一步处理中得到了更好的处理。

因此,处理这种情况的一种方法是编写一个接受python对象的自定义协议,将其转换为字节表示然后将其推送到传输上,因为我写这个Ashwini的答案刚刚出现,表明pickle,所以我们将用它来定义我们的自定义协议

import pickle 
from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ClientEndpoint


class ClassSender(Protocol):

    def dataReceived(self, data):
        print pickle.loads(data)

    def writeObject(self, _object):
        pickle.dump(_object,self.transport)


class ClassSenderFactory(ClientFactory):
    def buildProtocol(self, addr):
        return ClassSender()

class MyClass(object):
   def __init__(self,data):
       self.data = data

def SendObject(protocol):
    print "Sending"
    protocol.writeObject(MyClass('some sample data'))


point = TCP4ClientEndpoint(reactor, "localhost", 8000)
d = point.connect(ClassSenderFactory())
d.addCallback(SendObject)

reactor.run()

此示例代码尝试在TCP上建立与端口8000(localhost)的连接。建立连接后,我们采取一个样本对象,将其腌制并将其推送到传输上。

相反,当收到数据时,我们会尝试将其打开并打印到控制台。

要查看此操作,请运行回显服务器(http://twistedmatrix.com/documents/current/core/examples/echoserv.py)并运行然后运行示例代码,以查看示例对象是否从回显服务器退回。

问题在于需要考虑很多极端情况。如果数据被分成两个块怎么办,所以我们不能在一次调用中解开它?幸运的是,twisted提供了一个现成的类来处理这个叫做透视代理的事务。如果你控制了电线的两端,这可以解决很多这些问题。看看:https://twistedmatrix.com/documents/12.2.0/core/howto/pb-intro.html