tcp 半包、粘包问题

2015-10-21 10:47:36 +08:00
 broadliyn

做消息推送服务器,自己设计了一套私有协议。

但是有一个问题。传统的 http 是一应一答的,消息推送是长链接的,如果客户端不按照规定的协议格式来传输数据,就会导致服务器端无法正常解析数据。

因为拆包粘包的问题,一旦缓冲区的部分数据异常,那么后边数据就会全部出错都无法解析(因为缓冲区的数据都是连续的,根据特定字节长度来读取字段数据:readInt/readLong/readChar 等)。

那么出现这样的错误数据无法解析,服务器端应该如何处理呢?
我的想法是,一个消息协议以某个特殊字符串开头(如:$^&* ),当服务器数据解析出错时,那么就把错误的数据全部 discard ,直到遇到下一个“$^&*”为止。

3620 次点击
所在节点    问与答
25 条回复
qq286735628
2015-10-21 20:40:33 +08:00
消息推送? BS 架构可以直接用 SSE ,对于不支持 EventSource 的浏览器,可以很容易用 HTTP 降级处理。
broadliyn
2015-10-21 23:20:28 +08:00
@register 谢谢,其实主要这里是我没有找到一个合适的说明方式。
准确的说应该是 tcp 是流协议,其中一个 packet 数据出错可能会影响后续的 packet 数据。。
broadliyn
2015-10-21 23:20:53 +08:00
@inevermore 非常感谢!
int64ago
2015-10-22 00:34:06 +08:00
每个消息都有固定头尾格式的话,其实一个轮询+正则就搞定了
wind4
2015-10-22 07:21:36 +08:00
TCP 自带校验,不会出现丢包,也就不会出现解包错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/229769

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX