TCP 粘包拆包

TCP 是一个 “流” 协议,所谓的流,就是没有界限的一个长串的二进制数据。TCP 的底层并不了解上层业务的数据的具体意义,它会根据 TCP 缓冲区的实际情况进行包的划分,

编解码

在了解编解码前,我们可以先了解编码和解码。我们也习惯将编码(Encode)称之为序列号,将发送方对象序列化为字节数组,用于数据在网络中传输

Netty常用解码器

在使用 NIO 进行网络编程的时候,往往需要将读取到的字节数组或者字节缓冲区解码为业务可以使用的 POJO 对象。在 Netty 中就提供了一个抽象的解码工具类 ByteToMessageDecoder

FixedLengthFrameDecoder

FixedLengthFramDecoder 是固定长度解码器,它能够按照指定的长度对消息进行自动解码,开发者不需要考虑 TCP 的粘包和拆包等问题,非常实用。

FixedLengthFrameDecoder案例

上一章,我们了解了 FixedLengthFrameDecoder 理论知识,它在 Netty 中是一个固定长度解码器,有着很重要的作用。用户可以在服务端和客户端设置自定义的长度。该解码器就会以该长度定长解码

LineBasedFrameDecoder

LineBasedFrameDecoder 是回车换行解码器,它会找接收到的消息里面是否有 `\r\n` 。如果有就认为这个标识之前的数据就是一段数据。

LineBasedFrameDecoder案例

上一章,我们了解了 LineBasedFrameDecoder 理论知识,它在 Netty 中是回车换行解码器,有着很重要的作用。它会找接收到的消息里面是否有 `\r\n` 。如果有就认为这个标识之前的数据就是一段数据

DelimiterBasedFrameDecoder

DelimiterBasedFrameDecoder 意为分隔符解码器。它是按照指定分割符进行解码的解码器,通过分隔符可以将二进制流拆分成完整的数据包。回车换行解码器实际上是一种特殊的 DelimiterBasedFrameDecoder 解码器。

DelimiterBasedFrameDecoder案例

上一章,我们了解了 DelimiterBasedFrameDecoder 理论知识,它在 Netty 中是一个特殊字符码解码器,有着很重要的作用。它会找接收到的消息里面是否有自定义的特殊字符 。如果有就认为这个标识之前的数据就是一段数据。

LengthFieldBasedFrameDecoder

前面我们已经了解到了定长解码器,行解码器和分割符解码器,其实在大多数的协议中在协议头中会携带长度属性,用于标识消息体或者整包消息的长度