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