多语言展示
当前在线:420今日阅读:159今日分享:18

Netty如何通过定长解码器解决粘包半包的问题

Netty是基于Java NIO封装的非阻塞和异步通信编程框架,在传输层依赖的是TCP协议,该协议是流式读写的,在数据读写过程中,会出现粘包和半包读写的问题,本篇经验就分享一下如何通过Netty框架提供的定长解码处理器处理粘包半包问题。注意:本篇经验会使用如下两篇经验构建的Netty服务端和客户端工程。 0如何通过Netty开发基于NIO的服务端程序0如何通过Netty开发基于NIO的客户端程序
工具/原料
1

Eclipse

2

Netty5.0

方法/步骤
1

Maven工程pom.xml文件添加相关依赖图示,工程 pom 文件中添加 netty-codec-http 的依赖,客户端和服务端两个工程均需要添加

2

服务端工程添加Netty内置的定长解码处理器和字符串解码处理器图示,在设置事件处理器责任链时,引入 Netty 内置的定长解码处理器 FixedLengthFrameDecoder 和 字符串解码处理器 StringDecoder ,前者用于处理粘包和半包读写的问题,后者主要用于简化自定义处理器中的代码开发。

3

修改服务端自定义事件处理器图示,因为我们引入了字符串解码处理器,所以自定义事件处理器中 channelRead 方法接受到的数据就直接是字符串类型了,而不是原生的 ByteBuf 类型,并且因为定长解码处理器配置的消息长度为6个字节,因此客户端断开连接的命令由 exit 改为 exitit

4

客户端工程添加Netty内置的定长解码处理器和字符串解码处理器,并修改客户端自定义事件处理类图1示:和服务端工程的修改类似,我们在配置客户端事件处理器责任链时,添加Netty内置的定长解码处理器 FixedLengthFrameDecoder 和 字符串解码处理器 StringDecoder图2示:因为使用了字符串界面处理器,自定义事件处理类的 channelRead 方法需要进行相应修改

5

分别启动服务端和客户端,进行通信测试图示,客户端向服务端发送了11个字节,因为我们服务端设置的定长消息是6个字节,因此服务端只收到了前6个字节,后面5个字节因为被认为消息未接受完整,而不被处理。

6

客户端再次发送一个字节,进行测试图示,客户端再次发送一个字节,服务端收到后,拼接到上步骤缓冲区保留的5个字节,共计6个字节,满足消息长度,进行处理响应

推荐信息