为什么只有TCP会发生粘包
TCP 是一个面向字节流的协议,它是性质是流式的,所以它并没有分段。就像水流一样,你没法知道什么时候开始,什么时候结束。
所以他会根据当前的套接字缓冲区的情况进行拆包或是粘包
举个栗子:
发送端发送了一个由2个100字节组成的200字节的数据包到服务端的缓冲区,接受端从缓冲去一次取80字节的数据,那么第一次取的就是一个不完整的数据包,第二次取就会带上第一个数据包的尾部和下一个数据包的头
网上查了一些资料,大神们说的很专业,理解起来可能不是那么通俗易懂,大多数人找资料,只是为了解决问题
先看问题,如图
netty去监听客户端数据,一般设备发送数据,会以一定的格式发送,比如"3E" “3F”,可以以"3F"做为一个固定字符去切割数据
netty 拆包方式:
① 消息定长,如每个报文大小固定为200个字节,如果不够,空格补位。(常用)FixedLengthFrameDecoder
② 按照特定字符切割。(常用)DelimiterBasedFrameDecoder
③ 将消息划分为消息头和消息体,消息头中包含消息总长度的字段。(不常用)
NettyClientHandler
发送五次消息
@Override
public void channelActive(ChannelHandlerContext ctx