我有一个客户机/服务器架构(C# .Net 4.0),它以字节数组的形式发送数据的命令包。在任何命令中都有可变的参数数,并且每个参数的长度都是可变的。因此,我使用分隔符作为一个参数和整个命令的结尾。操作数总是2字节,两种类型的分隔符都是1字节。最后一个parameter_delmiter是多余的,因为command_delmiter提供了相同的功能。
命令结构如下:
FIELD                  SIZE(BYTES)
operand                2
parameter1             x
parameter_delmiter     1
parameter2             x
parameter_delmiter     1
parameterN             x
.............
.............
command_delmiter       1参数来源于许多不同的类型,例如,into、字符串等,它们都编码成字节数组。
我遇到的问题是,有时参数在编码为字节数组时包含与分隔符值相同的字节。例如command_delmiter=255..。而一个参数可能有它里面的字节。
有三种方法可以解决这个问题:
1)对参数进行不同的编码,使其永远不能与分隔符(255和254)模数相同。这将意味着参数将变得更大( Int16将超过2个字节等)。
2)根本不使用分隔符,在命令结构的开头使用计数和长度值。
3)使用其他的东西。
据我所知,TCP/IP缓冲区的工作方式是,必须使用某种分隔符来分隔“命令”或“数据束”,因为缓冲区可能包含多个命令,或者命令可能跨越多个缓冲区。所以这就是
BinaryReader / Writer似乎是一个明显的候选,唯一的问题是字节数组可能包含多个命令(其中包含参数)。因此,仍然需要对字节数组进行切分,才能感觉到BinaryReader。
有什么建议吗?
谢谢。
发布于 2011-08-17 16:09:03
这样做的标准方法是在消息的(固定)前几个字节中有消息的长度。因此,您可以有前4个字节来表示消息的长度,读取消息内容的许多字节。接下来的4个字节是下一个消息的长度。长度为0可以表示消息的结束。或者您可以使用带有消息计数的标头。
另外,请记住TCP是一个字节流,所以不要期望每次从套接字读取数据时都有完整的消息可用。您可以在每次读取时接收任意数量的字节。
https://stackoverflow.com/questions/7090438
复制相似问题