消息粘包
- TCP保证数据完整性、顺序性,不会发生消息粘包
- UDP不保证数据完整性,可能发生丢包的情况
- 粘包并非数据传输层的粘包,是数据处理逻辑层面上的粘包,也就是网络上各种包的处理。比如接收的包不是想要的包,或者接收包的顺序发生错误等
消息不完整性
- TCP不会发生数据不完整的情况,一旦出现一定是TCP停止运行
- 消息不完整依然指的是数据逻辑接收层面。物理传输层面数据一定能安全完整的送达另一端,但另一端可能因为缓冲区不够或数据接收逻辑不够完整导致只能读取部分数据
可能出现的消息传输错误
- 多消息粘包
- 单消息不完整
- 消息到达提醒重复触发(读消息时未设置取消监听)
解决方案
- 单消息不完整可增大接收ByteBuffer的容量
- 消息到达提醒重复触发可在消息到达读取时取消对SelectionKey的监听
key.interestOps(key.readyOps() & ~keyOps)
key.cancel();
有序的混传数据方案
- 数据传输加上开始或结束标记,需要逐个扫描字符看是不是结束符,比较耗性能
- 数据传输使用固定头部,可以在头部包含要发送数据的长度,那接收时只需接受指定长度的字符串即可,比较优秀的方案
- 混合方案:固定头部、数据加密、数据描述