关于TCP数据包格式化有什么好的建议吗?
我正在为手机创建一个应用程序,它通过TCP连接将加速度测量发送到服务器 我希望尽可能地减少消息长度,但同时我希望能够扩展当前的格式,而无需修改接收方解析机制 开始时,我以以下格式发送字符串:关于TCP数据包格式化有什么好的建议吗?,tcp,Tcp,我正在为手机创建一个应用程序,它通过TCP连接将加速度测量发送到服务器 我希望尽可能地减少消息长度,但同时我希望能够扩展当前的格式,而无需修改接收方解析机制 开始时,我以以下格式发送字符串: ##measurementTime#AccelerationX#AccelerationY#AccelerationZ 但是在实现后不久,我在消息中添加了一些其他数据,我意识到如果我必须频繁修改格式,这将需要很多时间 我曾经考虑过XML,但是它增加了很多负载,这当然是我想要避免的(测量值每100-250毫
##measurementTime#AccelerationX#AccelerationY#AccelerationZ
但是在实现后不久,我在消息中添加了一些其他数据,我意识到如果我必须频繁修改格式,这将需要很多时间
我曾经考虑过XML,但是它增加了很多负载,这当然是我想要避免的(测量值每100-250毫秒发送一次)。我真诚地建议将数据包结构更改为二进制格式。如果您想减小数据包的大小,这还将允许根据数据包的定界方式轻松实现可伸缩性 您可以采取以下措施: n字节开始+大小
n字节时间
2-8字节x
2-8字节y
2-8字节z
如果需要完全坚持ASCII文本类型流,建议发送简单的键名/值对。关键字名称用于描述每个值传达的字段名称,类似于原始提案:
##keyName1=value1#keyName2=value2#
或者,您可以以二进制标记格式发送数据,例如:
<tagCodeNum><lengthInBytes><tagValueAsBytes>
其中tagCodeNum可能是一个字节或单词,长度是一个字节或单词,具体取决于您的需要。这种格式的思想是,接收者可以识别它通过代码编号理解的字段,然后也可以跳过它不知道如何解码的标签。通过这种方式,编码变得可扩展。如果需要将多个标记分组到逻辑消息中,我会将一组二进制编码的标记打包到整个消息层次结构中:
<messageCodeNum><lengthInBytes><tag><tag><tag>
其中,上面的标记是上面描述的先前标记构造的复制,长度描述了组合在一起的所有标记的字节长度
注意:如果您考虑这个结构,它与XML类型的结构没有太大的不同,但是它更加简洁和受限,因此几乎不需要解码 思考一些优化的东西:
-仅发送与上一个值的差值
-不时发送完整的帧
-不要使用xml,创建结构定义
我想在一点基础上再接再厉。这就是通常所说的标记长度值编码。想法是第一个代码是标记,它告诉您如何解释值。第二个代码是长度,它告诉您值中有多少字节。这是一种进行可扩展二进制编码的好方法,在MPEG编码中被大量使用 我想补充一些关于良好功能二进制协议的提示/要求:
您可以改用JSON。它不会像二进制格式那样紧凑,但比XML紧凑得多。您可以轻松地扩展数据格式。请解释“如果我必须频繁修改格式,这将花费大量时间”这是什么意思?解析消息时遇到问题吗?发送是否花费太长时间?现在我计算“#”字符的实例并解析消息。这不是一个问题,但我很高兴听到任何可以简化解析的建议。请用其他事实更新您的问题。什么语言?