Socket数据传输的可能存在问题及解决方案

本文探讨了TCP和UDP协议下的消息粘包与完整性问题,分析了数据逻辑接收层面可能出现的错误,包括多消息粘包、单消息不完整及消息到达提醒重复触发,并提出了增大ByteBuffer容量、取消监听等解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消息粘包

  • TCP保证数据完整性、顺序性,不会发生消息粘包
  • UDP不保证数据完整性,可能发生丢包的情况
  • 粘包并非数据传输层的粘包,是数据处理逻辑层面上的粘包,也就是网络上各种包的处理。比如接收的包不是想要的包,或者接收包的顺序发生错误等

消息不完整性

  • TCP不会发生数据不完整的情况,一旦出现一定是TCP停止运行
  • 消息不完整依然指的是数据逻辑接收层面。物理传输层面数据一定能安全完整的送达另一端,但另一端可能因为缓冲区不够或数据接收逻辑不够完整导致只能读取部分数据

可能出现的消息传输错误

  • 多消息粘包
  • 单消息不完整
  • 消息到达提醒重复触发(读消息时未设置取消监听)

解决方案

  • 单消息不完整可增大接收ByteBuffer的容量
  • 消息到达提醒重复触发可在消息到达读取时取消对SelectionKey的监听
    key.interestOps(key.readyOps() & ~keyOps) 
    key.cancel();
  • 多消息粘包看下文

有序的混传数据方案

  • 数据传输加上开始或结束标记,需要逐个扫描字符看是不是结束符,比较耗性能
  • 数据传输使用固定头部,可以在头部包含要发送数据的长度,那接收时只需接受指定长度的字符串即可,比较优秀的方案
  • 混合方案:固定头部、数据加密、数据描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值