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