在服务器和客户端之间发送数据

时间:2010-07-14 17:49:25

标签: twisted transport

我正在尝试使用twisted实现的服务器和客户端之间传输数据。据我所知,使用self.transport.write([data])只有在数据是字符串时才有效。有没有其他方法可以发送其他类型的对象?谢谢!

1 个答案:

答案 0 :(得分:7)

套接字携带字节。这是他们携带的唯一一种东西。 TCP连接的任何两个端点只能相互传送字节。

字节不是每种通信形式最有用的数据结构。因此,除了这个字节传输之外,我们还发明了用于格式化和解释字节的方案。这些是协议。

Twisted将协议表示为类,almsot始终是twisted.internet.protocol.Protocol的子类,它实现了特定的方案。

这些类具有将非纯字节转换为纯字节的方法。例如,twisted.protocols.basic.NetstringReceivernetstring protocol的实现。它将特定的字节数转换为字节,表示字节数和字节本身。这是一个相当微妙的协议,因为字节数不是很明显,也是需要传达的信息。

这些类还根据它们实现的协议,在dataReceived方法中解释从网络接收的字节,并将结果信息转换为更结构化的信息。 NetstringReceiver使用长度信息从网络接受恰当数量的字节,然后将它们作为单个Python stringReceived实例传递给str回调。

其他协议的执行次数超过NetstringReceiver。例如,twisted.protocols.ftp包括FTP协议的实现。 FTP是一种旨在通过套接字(或实际上是几个套接字)传递文件列表和文件的协议。 twisted.mail.pop3实现了POP3,这是一种通过套接字传输电子邮件的协议。

有许多不同的协议,因为您可能想要做很多很多不同的事情。根据您正在尝试做的事情,可能有不同的方法来转换为字节和从字节转换,以使事情更容易或更快或更强大(等等)。因此,对于一般情况,没有单一的协议是理想的。这包括“发送对象”的情况,因为对象可以采用许多不同的形式,并且可能有许多不同的原因要发送它们,并且有许多不同的方法可能需要处理诸如对象的变异之类的事情。以前发过,等等。

您可能希望花一点时间考虑您需要什么样的通信。这应该建议您选择进行通信的协议。

例如,如果您希望能够在连接另一端存在的Python对象上调用方法,那么Twisted Spread可能会很有趣。

如果你想要一些跨语言的东西,只需要传达简单的类型,如整数,字符串和列表,那么XML-RPCTwisted How-To)可能更合适。

如果您需要比XML-RPC更节省空间的协议并支持更复杂类型的序列化,那么AMP可能更合适。

这个名单还在继续。 :)