在实现dataReceived方法时,在Twisted中,似乎没有任何示例涉及被分段的数据包.在其他所有语言中,这是你手动实现的东西,所以我只是想知道这是否已经为你做了扭曲或者什么?如果是这样,我是否需要在数据包前加上长度标题?或者我必须手动执行此操作吗?如果是这样,那将是什么方式?
在dataReceived方法中,您将数据作为一个不确定长度的字符串返回,这意味着它可能是您协议中的整个消息,或者它可能只是某个"客户端"发送给您的消息的一部分.您必须检查数据以查看它是否包含协议中的整个消息.
我目前正在我的一个项目中使用Twisted来实现协议,并决定使用struct模块来打包/解压缩我的数据.我正在实现的协议具有固定的头大小,所以在我读取至少HEADER_SIZE字节数之前,我不构造任何消息.总消息大小在此标头数据部分中声明.
我猜你真的不需要将消息长度定义为协议的一部分,但它有所帮助.如果您没有定义一个,则必须有一个特殊的分隔符来确定消息的开始/结束时间.排序FIX协议如何使用SOH字节来分隔字段.虽然它确实有一个必填字段,告诉你消息有多长(而不是消息中有多少个字段).
在处理TCP时,你应该忘记所有"数据包"的概念.TCP是一种流协议 - 您将数据流传输到另一端的数据流.一旦数据被发送,只要数据全部以正确的顺序到达,就允许它根据需要到达尽可能多的块.您必须像使用其他语言一样手动进行分隔,使用长度字段,消息类型字段或特殊分隔符等.