Netty-长连接,心跳机制

本文最后更新于:2 年前

tcp 粘包?netty 解决办法?

  • 使⽤ Netty ⾃带的解码器
  1. LineBasedFrameDecoder : 发送端发送数据包的时候,每个数据包之间以换⾏符作为分隔, LineBasedFrameDecoder 的⼯作原理是它依次遍历 ByteBuf 中的可读字节,判断是否有换⾏符,然后进⾏相应的截取。
  2. DelimiterBasedFrameDecoder : 可以⾃定义分隔符解码器, LineBasedFrameDecoder 实际上是⼀种特殊的 DelimiterBasedFrameDecoder 解码器。
  3. FixedLengthFrameDecoder : 固定⻓度解码器,它能够按照指定的⻓度对消息进⾏相应的拆包。
  4. LengthFieldBasedFrameDecoder :
  • ⾃定义序列化编解码器
    头部有长度。

netty 长连接,心跳机制?

tcp 长连接短连接

TCP 在进⾏读写之前,server 与 client 之间必须提前建⽴⼀个连接。建⽴连接的过程,需要我们常说的三次握⼿,释放/关闭连接的话需要四次挥⼿。这个过程是比较消耗⽹络资源并且有时间延迟的。
短连接说的就是 server 端 与 client 端建⽴连接之后,读写完成之后就关闭掉连接,如果下⼀次再要互相发送消息,就要重新连接。

  1. 短连接的有点很明显,就是管理和实现都⽐较简单,

  2. 缺点也很明显,每⼀次的读写都要建⽴连接必然会带来⼤量⽹络资源的消耗,并且连接的建⽴也需要耗费时间。

⻓连接说的就是 client 向 server 双⽅建⽴连接之后,即使 client 与 server 完成⼀次读写,它们之间的连接并不会主动关闭,后续的读写操作会继续使⽤这个连接。⻓连接的可以省去较多的 TCP 建⽴和关闭的操作,降低对⽹络资源的依赖,节约时间。

对于频繁请求资源的客户来说,⾮常适⽤⻓连接

心跳机制

在 TCP 保持⻓连接的过程中,可能会出现断⽹等⽹络异常出现,异常发⽣的时候, client 与 server 之间如果没有交互的话,它们是⽆法发现对⽅已经掉线的。为了解决这个问题, 我们就需要引⼊⼼跳机制 。

⼼跳机制的⼯作原理是: 在 client 与 server 之间在⼀定时间内没有数据交互时, 即处于 idle 状态时, 客户端或服务器就会发送⼀个特殊的数据包给对⽅, 当接收⽅收到这个数据报⽂后, 也⽴即发送⼀个特殊的数据报⽂, 回应发送⽅, 此即⼀个 PING-PONG 交互。

  1. 所以, 当某⼀端收到⼼跳消息后, 就知道了对⽅仍然在线, 这就确保 TCP 连接的有效性。
  2. TCP 实际上⾃带的就有⻓连接选项,本身是也有⼼跳包机制,也就是 TCP 的选项:SO_KEEPALIVE 。
  3. 但是,TCP 协议层⾯的⻓连接灵活性不够。所以,⼀般情况下我们都是在应⽤层协议上实现⾃定义⼼跳机制的,也就是在 Netty 层⾯通过编码实现。通过 Netty 实现⼼跳机制的话,核⼼类是 IdleStateHandler 。