NIO 与 Netty 之 Netty 一
Netty 核心API
-
ChannelHandler: 自定义一个 Handler 类继承 ChannelInboundHandlerAdapter ,通过重写相应的方法实现业务逻辑。
- public void channelActive(ChannelHandlerContext ctx); 通道就绪事件
- public void channelRead(ChannelHandlerContext ctx, Object msg); 通道读取数据事件
- public void channelReadComplete(ChannelHandlerContext ctx); 数据读取完毕事件
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause); 通道发生异常事件
-
Pipeline 和 ChannelPipline: ChannelPipline 是一个 Handler 集合,负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链
- ChannelPipeline addFirst(ChannelHandler… shandlers); 把一个业务处理类添加到链中第一个位置
- ChannelPipeline addLast(ChannelHandler… shandlers);
-
ChannelHandlerContext: 事件处理器上下文对象, Pipeline 链中的实际处理节点。每个处理节点 ChannelHandlerContext 中包含一个具体的事件处理器 ChannelHandler , 同时 ChannelHandlerContext 中也绑定了响应的 pipline 和 Channel 的信息,方便对 ChannelHandler 进行调用
- ChannelFuture close(); 关闭通道
- ChannelOutboundInvoker flush(); 刷新
- ChannelFuture writeAndFlush(Object msg); 将数据写到ChannelPipeline 中, 当前的 ChannelHandler 的下一个 ChannelHandler 开始处理
-
ChannelOption: Netty 在创建 Channel 实例后, 一般需要设置 ChannelOption 参数。
- ChannelOption。SO_BACKLOG 初始化可连接队列大小。
- ChannelOption。SO_KEEPALIVE 一直保持连接活动状态
-
ChannelFuture: 表示 Channel 中异步IO操作的结果。
- Channel channel(); 返回当前正在进行IO操作的通道
- ChannelFuture sync(); 等待异步操作执行完毕
-
EventLoopGroup 和其实现类 NioEventLoopGroup: Netty 为了更好的利用多核CPU资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护这一个 Selector 实例。
-
ServerBootStrap 和 Bootstrap: 前者是服务器端启动助手,后者是客户端启动助手,通过它可以完成各种配置
- public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) 用于服务器端, 用来设置两个 EventLoop
- public B group(EventLoopGroup group); 用于客户端, 设置一个 EventLoop
- public B channel (Class<? extends C> channelClass); 设置服务器端的通道实现
- public B option(ChannelOption option, T value); 用来给ServerChannel 添加配置
- public ServerBootStrap chilkdOption(ChannelOption childOption, T value); 给接收到的通道添加配置
- public ServerBootStrap childHandler(ChannelHandler childHandler); 设置业务处理类(自定义的 handler)
- public ChannelFuture bind(int inetPort); 设置服务器端端口号
- public ChannelFuture connect(String inetHost, int inetPort); 设置客户端连接服务器端
-
Unpooled: Netty 提供的专门用来操作缓冲区的工具类
- public static ByteBuf copiedBuffer(CharSequence string, Charset charset); 通过给定的数据和字符编码返回一个 ByteBuf 对象(类似于 NIO 中的 ByteBuffer 对象)
Netty 编码和解码
概述
数据在网络传输的都是二进制字节码数据,而需要的数据往往不是二进制数据。因此发送数据需要编码,接收数据需要解码。
encoder将数据转为二进制,decoder将字节码数据转为业务数据
Java中的序列化也可以作为coder使用,不建议
- 无法跨语言
- 序列化后体积太大,是二进制编码的5倍多
- 序列化性能低
Netty自带的一些coder
- StringEncoder StringDecoder
- ObjectEncoder ObjectDecoder
ObjectEncoder和ObjectDecoder实现对POJO对象的编码解码,内部是使用序列化技术,不建议使用。
Google 的 Protobuf
专门用来做网络编码解码工作
- 跨平台、多语言
- 高性能,高可靠性
- 使用 protobuf 编译器能自动生成代码, Protobuf 是将类的定义使用 .proto 文件进行描述,然后通过 protoc.exe 编译器根据 .proto 自动生成 .java文件。