6

在 Twisted 中,当实现 dataReceived 方法时,似乎没有任何例子提到数据包被分段。在所有其他语言中,这是您手动实现的,所以我只是想知道这是否已经在扭曲中为您完成了,还是什么?如果是这样,我是否需要在我的数据包前面加上一个长度标头?还是我必须手动执行此操作?如果是这样,那会是什么方式?

4

3 回答 3

6

在 dataReceived 方法中,您将数据作为不确定长度的字符串返回,这意味着它可能是您协议中的完整消息,也可能只是某些“客户端”发送给您的消息的一部分。您必须检查数据以查看它是否包含协议中的完整消息。

我目前在我的一个项目中使用 Twisted 来实现协议,并决定使用 struct 模块来打包/解包我的数据。我正在实现的协议具有固定的标头大小,因此在我至少读取 HEADER_SIZE 字节数之前我不会构造任何消息。总消息大小在此标头数据部分中声明。

我想您实际上并不需要将消息长度定义为协议的一部分,但这会有所帮助。如果您没有定义一个,则必须有一个特殊的分隔符来确定消息何时开始/结束。FIX 协议如何使用 SOH 字节来分隔字段。尽管它确实有一个必填字段来告诉您一条消息有多长(只是不是一条消息中有多少个字段)。

于 2009-01-20T05:47:42.567 回答
6

在处理 TCP 时,您真的应该忘记所有“数据包”的概念。TCP 是一种流协议 - 您将数据流入并从另一端流出数据。一旦数据被发送,只要数据都以正确的顺序到达,它就可以到达任意多或尽可能少的块。您必须像使用其他语言一样手动进行分隔,使用长度字段、消息类型字段或特殊分隔符等。

于 2009-01-20T14:20:12.720 回答
2

您还可以使用 LineReceiver 协议

于 2009-05-03T16:01:47.913 回答