Netty总述

1. Netty的基础组件:
Channel、ChannelHandler、ChannelHandlerContext、ChannelInitializer、ChannelFauture、ChannelOption、
EventLoop、EventLoopGroup、ChannelPipeline、ServerBootStrap、BootStrap

2. 运行原理

3. 解码、编码器:

4. 应用之Http服务器:HttpRequestEncoder、HttpResponseDecoder

5. 应用之心跳检测机制: IdeaStateHandler() + useEventTriggered()
   1> 客户端监听ALL_IDLE事件,发送Ping,服务器检测是ping的请求,响应pong
   2> 服务端监听READER_IDLE事件,同上。
   注意:这里IdleEvent事件,是指连接空闲时间 事件触发[有链接才会有触发]。(所以当你只开启server端,server端的IdleStateHandler()是不会触发的)

6. 应用之高效序列化:ProtoBuf、ProtoStuff

7. 沾包、拆包问题:(Netty提供的协议解析器)
  > 基于分隔符:
    DelimiterBasedFrameDecoder: 指定特定的分隔符,来切割帧
    LineBasedFrameDecoder: 使用"\r\n"来切割帧(LineBasedFrameDecoder比DelimiterBaseFrameDecoder快)

  > 基于长度:
    FixedLengthFrameDecoder:FixedLengthFrameDecoder(int frameLength) 构造函数指定帧长,来切割帧,固定长度切割
    LengthFieldBasedFrameDecoder:
      (1) maxFrameLength - 发送的数据包最大长度;
      (2) lengthFieldOffset - 长度域偏移量,指的是长度域位于整个数据包字节数组中的下标;
      (3) lengthFieldLength - 长度域的自己的字节数长度。
      (4) lengthAdjustment – 长度域的偏移量矫正。 如果长度域的值,除了包含有效数据域的长度外,还包含了其他域(如长度域自身)长度,那么,就需要进行矫正。矫正的值为:包长 - 长度域的值 – 长度域偏移 – 长度域长。
      (5) initialBytesToStrip – 丢弃的起始字节数。丢弃处于有效数据前面的字节数量。比如前面有4个节点的长度域,则它的值为4。

| ---------------------------------------------------------------------------------------------------|
|    >> FixedLengthFrameDecoder主要处理 定长帧。对于变长的帧,需要使用LengthFieldBasedFrameDecoder。
|    >> blog包下的协议处理讲解:(我的理解:这个构造的每个值都不是固定的,要结合Decoder时,使用)
|       new LengthFieldBasedFrameDecoder(1024, 0, 4, -4, 0):
|       - 1024 是帧的最大长度
|       - 0    长度域下标
|       - 4    长度域字节数
|       - -4   长度域包含长度域的长度,这里要调整为 数据域的长度 ,所以是-4
|         包长 - 长度域的值 – 长度域偏移 – 长度域长 ==》X - X - 0 - 4 = -4
|       - 0  丢弃的起始字节数为0
|
| 这块的结合使用还是有点模糊,比如说initialBytesToStrip=0,或者等于5,具体影响到的是什么地方?
| --------------------------------------------------------------------------------------------------|

8. 重点注意:
  7里面,提供的协议解析器(按照分隔符、按照数据包长度) 等价于 我们自定义的ObjEncoder、ObjDecoder解析器。
  不同之处:
    1. 自定义的协议解析器,在实际Handler之前,已经将ByteBuf的数据转变成具体的对象,在Handler中接受的参数,
  就是自定义协议解析器,反序列后的对象。
    2. Netty提供的分隔符、数据包长度的两种解析器,在实际handler处理的时候,还是ByteBuf.

9. 断线重连:涉及两个部分
  核心方法是: EventLoop.schedule(new Runnable(),ttl,TimeUnit);

  1. 首次连接时,连接失败,重新连接:client.connect().addListener(new ChannelFutureListener());
  2. 连接成功后,中途断开,触发ChannelInactive()时,重新连接:ChannelHandlerContext.channel().eventLoop().schedule();

10. BIO\NIO\EPOLL的区别于理解

11. Netty的零拷贝
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值