【发布时间】:2011-03-16 00:07:02
【问题描述】:
我正在尝试在使用 twisted 实现的服务器和客户端之间传输数据。据我所知,只有当数据是字符串时,使用 self.transport.write([data]) 才有效。有没有其他方法可以发送其他类型的对象?谢谢!
【问题讨论】:
我正在尝试在使用 twisted 实现的服务器和客户端之间传输数据。据我所知,只有当数据是字符串时,使用 self.transport.write([data]) 才有效。有没有其他方法可以发送其他类型的对象?谢谢!
【问题讨论】:
套接字携带字节。这是他们唯一携带的东西。 TCP 连接的任意两个端点只能相互传送字节。
字节并不是对每种通信形式最有用的数据结构。因此,在这种字节传输之上,我们发明了格式化和解释字节的方案。这些是协议。
Twisted 将协议表示为类,几乎总是 twisted.internet.protocol.Protocol 的子类,它们实现了特定的方案。
这些类具有将非纯字节转换为纯字节的方法。例如,twisted.protocols.basic.NetstringReceiver 是netstring protocol 的实现。它将特定数量的字节转换为代表字节数和字节本身的字节。这是一个相当微妙的协议,因为字节数是否也是需要传达的信息并不是很明显。
这些类还根据它们实现的协议,在其dataReceived 方法中解释从网络接收到的字节,并将结果信息转换为更结构化的信息。 NetstringReceiver 使用长度信息从网络中接受正确数量的字节,然后将它们作为单个 Python str 实例传递给其 stringReceived 回调。
其他协议比NetstringReceiver 做得更多。例如,twisted.protocols.ftp 包括 FTP 协议的实现。 FTP 是一种协议,旨在通过一个套接字(实际上是多个套接字)传递文件列表和文件。 twisted.mail.pop3 实现了 POP3,这是一种通过套接字传输电子邮件的协议。
有很多很多不同的协议,因为您可能想做很多很多不同的事情。根据您要执行的操作,可能有不同的方式来转换字节和从字节转换,以使事情变得更容易、更快或更健壮(等等)。因此,对于一般情况,没有一个单一的协议是理想的。这包括“发送对象”的情况,因为对象可以采用许多不同的形式,并且可能有许多不同的原因要发送它们,并且您可能希望以许多不同的方式处理诸如更改对象之类的事情以前发送过,等等。
您可能想花一点时间考虑一下您需要什么样的沟通方式。这应该会建议您选择进行通信的协议的某些事项。
例如,如果您希望能够调用存在于连接另一端的 Python 对象的方法,那么Twisted Spread 可能会很有趣。
如果您想要跨语言的东西,并且只需要传达简单的类型,例如整数、字符串和列表,那么XML-RPC (Twisted How-To) 可能更合适。
如果您需要一个比 XML-RPC 更节省空间并支持更复杂类型的序列化的协议,那么AMP 可能更合适。
名单还在继续。 :)
【讨论】: