Python 如何在twisted中运输对象?

Python 如何在twisted中运输对象?,python,twisted,transport,Python,Twisted,Transport,我知道使用“transport.write()”可以传输字符串对象,但我想知道这是否可以传输其他类型的数据,比如python类对象? 如果可能的话,我该怎么做?您可以使用来序列化对象。几乎所有Python对象都是json可序列化的,如果不是,那么您可以编写自己的编码器-解码器来处理它们。但不要使用eval对输入进行解码 传输层的作用是将数据写入物理连接。它处于较低的抽象级别,python类对象到字节的映射在协议栈的更高层得到更好的处理 因此,处理这个问题的一种方法是编写一个自定义协议,它接受一个

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

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

传输层的作用是将数据写入物理连接。它处于较低的抽象级别,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(本地主机)。一旦建立了连接,我们将获取一个样本对象,对其进行pickle并将其推送到传输上

反过来,当接收到数据时,我们尝试将其解钩并将其打印到控制台

要查看此操作,请运行echo服务器(),然后运行示例代码以查看示例对象从echo服务器上反弹


这方面的问题是,有很多角落的情况需要考虑。如果数据被分为两个块,因此我们无法在一次调用中取消勾选,该怎么办?幸运的是,twisted提供了一个现成的类来处理这个称为透视代理的类。如果您可以控制导线的两端,那么这可以为您解决许多此类问题。看看:

您可以设计一些任意的自定义协议,但是使用一个已经存在的框架来实现这一目的可能会更有效率,比如谷歌的框架,它允许您轻松定义一个高效的消息传递结构,并且已经支持python了

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


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

不要用腌菜。不要用腌菜。不要用腌菜。永远不要向网络程序员新手建议使用pickle。看到上面的红色大盒子了吗。