ChannelOption.SO_KEEPALIVE
- 一直保持连接活动状态 。

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

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

文章插图
TCP粘包与拆包及解决方案
- TCP是面向连接的 , 面向流的 , 提供高可靠性服务 。收发两端(客户端和服务器端)都要有——成对的socket,因此 , 发送端为了将多个发送给接收端的包 , 更有效的发送给对方 , 使用了优化算法(
经验总结扩展阅读
- 高三物理学习方法技巧是什么 有哪些窍门
- 给朋友的腊八节祝福语
- 腊八节经典祝福文案15篇
- 腊八节祝福语集合
- 腊八节最暖心祝福语2023
- 国庆节姐姐祝福语2023
- 国庆节祝福姐姐的祝福语
- 银行国庆节短信祝福
- 2023国庆节祝福语
- 2023祝朋友七夕快乐的祝福语