TCP是面向字节流的协议,TCP保证字节流按顺序到达,并没有“包”的概念。但应用开发中,的确有“粘包”的问题出现,这是因为我们直接在TCP这种字节流协议上开发应用,这里的包是我们应用层的一个消息或一帧数据。
对于短连接的TCP服务,不用考虑分包的问题。
对于长连接的TCP服务,由于发送方和接收方分别都有发送缓冲区和接收缓冲区,有可能出现类似两个不完整的报文同时暂存在缓冲区中,应用层读取这样的字节流,就会出现“粘包”的错觉。
解决“粘包”也很简单,就好比我们在编写基于http协议的程序时不用考虑粘包问题一样,我们只需要实现一个类似http那样的协议,或者说实现一个可以将字节流区分成连续的包的协议,从而达到只关心消息到达,而不用关心数据到达的效果。一个比较典型、权威的解决方案,在Netty中就有案例。Netty中的ByteToMessageDecoder解码器,提供了如FixedLengthFrameDecoder(固定长度解码器)、DelimitedBasedFrameDecoder(分隔符解码器)、LengthFieldBasedFrameDecoder(长度编码解码器,将报文划分为报文头、报文体)等实现。
不妨添加我的微信公众号,每日精品原创干货不容错过。

694

被折叠的 条评论
为什么被折叠?



