[TOC]一、概述长度域解码器(LengthFieldBasedFrameDecoder)是解决 TCP 拆包/粘包问题最常用的解码器。它基本上可以覆盖大部分基于长度拆包场景,开源消息中间件 RocketMQ 就是使用长度域解码器进行解码的。长度域解码器相比固定长度解码器和特殊分隔符解码器要复杂一些,接下来我们就一起学习下这个强大的解码器。二、重要属性长度域解码器特有属性// 长度字段的偏移...
[TOC]一、解决方案短链接:发一个包建立一次连接,这样连接建立到连接断开之间就是消息的边界,缺点效率太低定长解码器:每一条消息采用固定长度,缺点浪费空间行解码器:每一条消息采用分隔符,例如 n,缺点需要转义LTC解码器:每一条消息分为 head 和 body,head 中包含 body 的长二、示例2.1 短链接客户端每次向服务器发送数据以后,就与服务器断开连接,此时的消息边界为连接建立到...
[TOC]一、粘包现象服务端代码import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.ch...
[TOC]一、内存回收(retain & release)由于 Netty 中有堆外内存(直接内存)的 ByteBuf 实现,堆外内存最好是手动来释放,而不是等 GC 垃圾回收。UnpooledHeapByteBuf 使用的是 JVM 内存,只需等 GC 回收内存即可UnpooledDirectByteBuf 使用的就是直接内存了,需要特殊的方法来回收内存PooledByteBuf 和它的子...
[TOC]一、ByteBuf组成ByteBuf由四部分组成说明ByteBuf 是一个字节容器,容器里面的的数据分为四个部分第一个部分是已经丢弃的字节,这部分数据是无效的;(已经读过的内容)第二部分是可读字节,这部分数据是 ByteBuf 的主体数据, 从 ByteBuf 里面读取的数据都来自这一部分;(已经写入但还未读取的内容)第三部分数据是可写字节,所有写到 ByteBuf 的数据都会写到...
[TOC]一、概述ByteBuf是对NIO中ByteBuffer的增强。相比于ByteBuffer,Netty 的 ByteBuf 具有卓越的功能性和灵活性。ByteBuf API 的优点可以被用户自定义的缓冲区类型扩展通过内置的复合缓冲区类型实现透明的零拷贝容量可以按需增长在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip() 方法在读和写使用了不同的索引支持方法的链...
[TOC]一、概述ChannelHandler 用来处理 Channel 上的各种事件,分为入站、出站两种。所有 ChannelHandler 被连成一串,就是 Pipeline入站处理器通常是 ChannelInboundHandlerAdapter 的子类,主要用来读取客户端数据,写回结果;出站处理器通常是 ChannelOutboundHandlerAdapter 的子类,主要对写回结...
[TOC]一、概述Future与Promise在异步处理时,经常用到这两个接口首先要说明 netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展。jdk Future:只能同步等待任务结束(或成功、或失败)才能得到结果;netty Fu...
[TOC]一、概述1.1 概念Channel是客户端和服务端建立的一个连接通道,是Netty抽象出来的网络I/O读写相关的接口。客户端有一个Channel(SocketChannel),服务端也有一个Channel(NioSocketChannel),当客户端和服务端建立连接后,客户端的Channel会跟服务端的Channel进行联通。1.2 Channel生命周期Channel的四个状态:...