当前位置: 首页 > 网络应用技术

Netty系列(3)-Netty处理TCP粘性软件包 /拆卸软件包

时间:2023-03-06 02:25:31 网络应用技术

  TCP是“流”协议。SO称为的流是没有边界的数据字符串。TCP的底层不了解上层业务数据的特定含义。它将根据TCP缓冲区的实际情况对包裹进行划分。因此,在业务方面,TCP可以将完整的软件包分成多个数据包,或者可以将其密封到一个大包装中。这是So -called TCP粘贴软件包和拆卸软件包。

  例如,在上一篇文章的演示程序中,客户端将两个数据发送给服务器,并且服务器还向客户端响应了两个数据。

  从输出结果来看,客户端和服务器只收到了一条数据输出线,表明两个数据包粘在一起,因此我们无法区分独立和完整的数据。

  TCP粘贴软件包/拆卸软件包的常见原因如下:

  由于基础TCP无法理解高层的业务数据,因此底层无法保证数据包不会被拆分和重组。该问题只能通过上层的设计协议堆栈设计来解决。

  为了解决坚持和拆卸的问题,关键点是读者需要了解一个完整的数据包,如何启动以及如何结束。根据解决行业主流协议的解决方案,可以总结以下内容。

  例如,以下程序是一个解决方案,该解决方案将固定的INT32添加到消息的总长度上,基于将固定的INT32添加到消息头:

  服务器,客户端读取和写作翻新:

  服务器和客户端输出,此时处理的数据是通过输出的完整数据。

  为了解决由TCP粘贴软件包/拆卸软件包引起的半数据包的问题,Netty提供了各种编解码器来默认处理半数据包,这也非常方便使用。

  LineBasedFramedeCoder解码器支持根据更改字符读取字节数组或读取字节数组。当我们编写数据时,我们需要在最后一个数据中添加一个行更改。阅读时,LineBasedFramedeCoder已自动删除了不加工的符号。

  必须将构造线基弗拉米德码器传递到最大长度参数中,这表明最大长度。如果找不到该长度遍历的字节,则将报告分离器。

  只需将此处理器添加到服务器和客户端:

  目前查看服务器和客户端数据交互式代码。您可以看到写数据时需要在行中添加更改。阅读数据时,它与以前相同,但是此时读取的数据不会粘在数据包上。

  可以知道,通过LineBasedFramedeCoder的继承系统,它是用于处理输入数据的通道输入处理器。FATHER-IN -LAW,实际上可以知道它是将字节转换为特定消息的解码器。

  可以通过ByteToMessageDecoder的方法来看待它。它最终将调用子类的解码方法来解码消息并将消息放入OUT集合中。分析后,将传播每个数据触发通道的读取事件,因此在后续处理器中获得的MSG是一个完整消息。

  然后查看由LineBasedFramedeCoder实现的父级解码方法。它将首先根据内存地址遍历字节,找到第一个分区位置,然后读取数据的相应长度。

  通过简单的分析源代码,我们可以理解,LineBasedFramedeCoder的工作原理是它依次遍历Bytebuf中的可读字节。字节形成了一条线。这是一个解码器,它转换了符号,支持了两种解码方法。结尾字符或不携带结尾字符,并支持配置配置的最大长度。如果您在阅读最大长度后仍然没有线条,您将抛出异常,同时忽略您之前阅读的异常代码流。

  编写数据时,首先将字符串写入ByteBuf缓冲区,然后将其写入频道;读取数据时,MSG会强烈转换为Bytebuf,然后将字节转换为字符串。可以看到,转身很麻烦。我们可以添加构建的字符串decoder和StringEncoder,以避免此转换。

  查看目前的服务器和客户端数据交互式代码,您可以看到目前可以直接编写字符串。阅读时,MSG直接转换为字符串进行处理。这样,您可以直接编写和读取字符串数据,以避免通过ByteBuf阅读。

  只需分析其源代码即可。编写数据时,编码是将字符串写入ByteBuf;读取数据时,解码,读取字节布夫中的字节数组,然后将其转换为字符串。

  DeLimiterBasedeDecoder可以自动完成结束符号的消息的解码。

  以同样的方式,您只需要将DelimiterBasedeCoder解码器添加到ChannelPipeline即可。在构造DelimiterBasedeCoder时,您需要传递特定的分离主义徽标。

  编写数据时,必须在末尾添加分割符号。

  reidentLengthFramedeCoder是一个固定长度解码器,可以根据指定的长度自动解码消息。

  Netty提供了各种协议支持,例如HTTP,WebSocket,SSL等。我们可以通过它提供的组件快速开发具有相应协议的服务器,而不必担心网络问题,例如TCP粘合剂/拆卸软件包。

  HTTP是建立在TCP传输协议上的应用层协议。以下程序是基于Netty的HTTP服务器。

  可以看出,主要添加以下处理器以支持HTTP协议:

  从Netty的源代码中,我们可以理解Netty提供了HTTP,HTTP2,REDIS,MQTT,SMTP,XML和其他主流协议的支持。基于Netty,我们可以快速开发相应的服务器和客户端程序,而不必担心网络问题。

  原始:https://juejin.cn/post/7100846192795811871