多语言展示
当前在线:180今日阅读:126今日分享:42

Netty如何通过行解码器解决读写粘包的问题

从数据传送层面看,TCP/IP是流式协议,其在读写数据时,不存在将数据按某规则分包的概念,这种情况会导致基于TCP/IP的网络通信应用在处理数据时有粘包的问题。Netty是一个基于TCP/IP的网络应用开发库,其提供了很多机制来处理这种问题场景,本篇经验就分享一下如何通过Netty提供的行解码事件处理器来解决粘包问题。注意:本篇经验会使用如下两篇经验构建的Netty服务端和客户端工程。0如何通过Netty开发基于NIO的客户端程序0如何通过Netty开发基于NIO的服务端程序
工具/原料
1

Eclipse

2

Netty5.0

方法/步骤
1

改造客户端程序,重现读写粘包的问题图1示,原本客户端主方法是从控制台接受用户输入,并发送到服务端,等待1秒钟后继续处理,这种情况通常不会出现粘包问题,改造为通过代码将一条消息发送到服务端 1000 次。图2示,运行服务端和客户端程序,可以看出服务端接收的数据杂乱无章,没有完整消息的概念,这就是读写粘包的问题。

2

客户端和服务端分别添加行解码器和字符串解码器图1示:客户端程序在配置事件处理器时添加行解码器 LineBasedFrameDecoder 和字符串解码器 StringDecoder, 后者用于简化自定义事件处理器的代码逻辑。 图2示:服务端程序在配置事件处理器时添加行解码器和字符串解码器。

3

修改客户度和服务端的自定义事件处理器图1示:因为上一步骤使用了字符串解码器,因此客户端自定义事件处理器接收的数据直接就是字符串类型,无需手工进行解码处理。图2示:同理,服务端自定义事件处理器会接收到字符串类型的数据,并且在应答客户端的数据后面,添加行分隔符,客户端会通过这个行分隔符来分隔消息。

4

分别启动客户端和服务端进行测试图1示:服务端接收到的数据,没有出现粘包问题图2示:客户度接收到的服务端响应数据,也没有出现粘包的问题

推荐信息