【问题标题】:how to transport an object in twisted?如何运输扭曲的物体?
【发布时间】:2014-01-22 03:39:57
【问题描述】:

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

【问题讨论】:

    标签: python twisted transport


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        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

        【讨论】:

        • 不要使用泡菜。不要使用泡菜。不要使用泡菜。永远不要建议对新手网络程序员使用pickle。查看docs.python.org/2/library/pickle.html 顶部的大红框。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 2015-09-03
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多