netty-分隔符和定长解码器的应用

TCP以字节流的方式进行数据传输,上层应用协议为了对消息进行区分,往往采用如下4种方式。

  1. 消息长度固定:累计读取到固定长度为LENGTH之后就认为读取到了一个完整的消息。然后将计数器复位,重新开始读下一个数据报文。
  2. 回车换行符作为消息结束符:在文本协议中应用比较广泛。
  3. 将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符。
  4. 通过在消息头中定义长度字段来标示消息的总长度。

netty中针对这四种场景均有对应的解码器作为解决方案。

 

DelimiterBasedFrameDecoder应用开发

DelimiterBasedFrameDecoder自动完成以分隔符作为码流结束标识消息结束的解码。

EchoServer收到EchoClient的请求消息后,将其打印出来,然后将原始消息返回客户端。消息以”$_” 作为分隔符。

如:

                //设置连接符/分隔符,换行显示

                ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());

                //DelimiterBasedFrameDecoder:自定义分隔符

                sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));

 

FixedLengthFrameDecoder 用于对固定长度的消息进行自动解码(定长消息):及发送的消息需要一定的长度,当长度不够时,                                     剩下的消息将会被丢弃,只能通过补空格来防止被丢弃

如实列:

设置每次发送长度为5个字符 pipeline.addLast(new FixedLengthFrameDecoder(5));

posted on 2020-09-21 14:59  shumeigang  阅读(329)  评论(0)    收藏  举报

导航