NIO 与 Netty 之 Netty 一

1 篇文章 0 订阅

NIO 与 Netty 之 Netty 一

Netty 核心API

  1. 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); 通道发生异常事件
  2. Pipeline 和 ChannelPipline: ChannelPipline 是一个 Handler 集合,负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链

    • ChannelPipeline addFirst(ChannelHandler… shandlers); 把一个业务处理类添加到链中第一个位置
    • ChannelPipeline addLast(ChannelHandler… shandlers);
  3. ChannelHandlerContext: 事件处理器上下文对象, Pipeline 链中的实际处理节点。每个处理节点 ChannelHandlerContext 中包含一个具体的事件处理器 ChannelHandler , 同时 ChannelHandlerContext 中也绑定了响应的 pipline 和 Channel 的信息,方便对 ChannelHandler 进行调用

    • ChannelFuture close(); 关闭通道
    • ChannelOutboundInvoker flush(); 刷新
    • ChannelFuture writeAndFlush(Object msg); 将数据写到ChannelPipeline 中, 当前的 ChannelHandler 的下一个 ChannelHandler 开始处理
  4. ChannelOption: Netty 在创建 Channel 实例后, 一般需要设置 ChannelOption 参数。

    • ChannelOption。SO_BACKLOG 初始化可连接队列大小。
    • ChannelOption。SO_KEEPALIVE 一直保持连接活动状态
  5. ChannelFuture: 表示 Channel 中异步IO操作的结果。

    • Channel channel(); 返回当前正在进行IO操作的通道
    • ChannelFuture sync(); 等待异步操作执行完毕
  6. EventLoopGroup 和其实现类 NioEventLoopGroup: Netty 为了更好的利用多核CPU资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护这一个 Selector 实例。

  7. 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); 设置客户端连接服务器端
  8. 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文件。

Netty-demo & Netty 简易RPC

Netty-demo & Netty 简易RPC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值