本文仅供参考,因为该结论是根据本公司项目小结😄
Question:
如果服务端通过socket传过来的数据由于某种原因导致一帧数据的前4个字节并不是一个Int数据,那么这个时候我并不知道,所以我还是采用这个方法去读的,就会有问题了。
Answer:
按照IM数据传输协议规定好的数据帧结构,一旦出现客户端接受数据解析时异常,比如:数据帧结构中规定前4个字节表示整个数据帧的长度,而由于某种不可抗因素导致某次客户端接受到的data里前4个字节并不是正常的数据长度,这个时候我们客户端也并不知道,所以只能依旧去读前4个字节,而恰好读到的整数又不是什么负数或者很大很大的不合理数,此时我们只能认为这个数据长度是正常的,所以紧接着就会继续去buffer里读后面的数据,然而这个时候读到的数据帧里消息体的数据就是错误的了,下面的解析自然也就没法正常解析出来数据。
这个时候按照我的想法是我解析失败的时候回执给服务端一个错误消息,告诉服务端我这条消息接收错误了,你重新给我从这条消息开始把后面的消息重传一遍,同时我把receiveBuffer清空,我以为这样就能解决问题了,但实际上这里有两个问题:
1、消息体数据读取都失败了,我怎么知道这条消息是什么?如何回执给服务端?
2、如果这个时候服务端依旧在给我发消息,而且某条消息的数据正传输到一半,这个时候就算服务端接收到我的回执了,也开始重新传输了,那么在开始重传的时候前面已经有半帧的垃圾数据,客户端接收到的时候又会影响数据帧的读取和解析了,这样下去就是一个死循环了。。。好绝望!!!
然后冯总挥舞了一下雄壮的臂膀,指点江山的说,这种情况下就直接断开socket,进行重连,重连之后再告诉服务端你上一条成功接收的消息id是什么,瞬间觉得简直英明啊!!为什么说英明呢??
1、断开的时候就停止了所有的数据传输,服务端那边自然会处理当前socket中的数据状态,该缓存的缓存,该入库的入库;
2、重新连接之后不会存在重用socket的时候一帧数据只传了一半,从而续传的时候存在垃圾数据的干扰,保证传输一定按照既定的IM数据报协议进行;
image.png











网友评论