Netty学习记录-入门篇( 六 )


  • 【Netty学习记录-入门篇】ChannelOption.SO_KEEPALIVE
    • 一直保持连接活动状态 。
  • EventLoopGroup 和其实现类 NioEventLoopGroup
    Netty学习记录-入门篇

    文章插图
    • BoosEventLoopGroup通常是一个单线程的EventLoop , EventLoop维护着一个注册了ServerSocketChannel的Selector实例 , BossEventLoop不断轮询将连接事件分离出来 。
    • 通常是OP_ACCEPT事件 , 然后将接收到的SocketChannel交给WorkerEventLoopGroup
    • WorkerEventLoopGroup会由next选择其中一个EventLoop来将这个SocketChannel注册到其维护的Selector并对其后续的IO事件进行处理 。
    常用方法:
    - public NioEventLoopGroup(): 构造方法- public Future<?> shutdownGracefully(): 断开连接 , 关闭线程Unpooled类Netty提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类
    常用方法如下:
    public static ByteBuf copiedBuffer(CharSequence String, Charset charset):通过给定的数据和字符编码返回一个ByteBuf对象(类似于NIO中的ByteBuffer)Google Protobuf
    Netty学习记录-入门篇

    文章插图
    Netty本身自带的 ObjectDecoderObjectEncoder可以用来实现POJO对象或各种业务对象的编码和解码 , 底层使用的仍然是Java序列化技术 , 而Java序列化技术本身效率就不高 , 存在如下问题:
    • 无法跨语言
    • 序列化后的体积太大 , 是二进制的5倍多
    • 序列化性能太低 引出新的解决方案:Google的Protobuf

    Netty学习记录-入门篇

    文章插图
    Netty编解码器和handler的调用机制代码示例:netty-decoder模块
    使用自定义的编码器和解码器来说明Netty的handler调用机制
    • 客户端发送long -> 服务器
    • 服务器发送long -> 客户端
    结论:
    • 不论解码器handler还是编码器handler接收的消息类型必须与待处理的消息类型一致 , 否则该handler不会被执行
    • 在解码器进行数据解码时 , 需要判断缓存区(ByteBuf)的数据是否足够 , 否则接收到的结果会与期望的结果可能不一致 。
      • ReplayingDecoder扩展了ByteToMessageDecoder类 , 使用这个类 , 我们不必调用readableBytes()方法 。参数S指定了用户状态管理的类型 , 其中Void代表不需要状态管理 。
      • ReplayingDecoder使用方便 , 但它也有一些局限性:
      • 并不是所有的 ByteBuf操作都被支持 , 如果调用了一个不被支持的方法 , 将会抛出一个 UnsupportedOperationException
      • ReplayingDecoder 在某些情况下可能稍慢于 ByteToMessageDecoder , 例如网络缓慢并且消息格式复杂时 , 消息会被拆成了多个碎片 , 速度变慢 。

    Netty学习记录-入门篇

    文章插图
    TCP粘包与拆包及解决方案