【问题标题】:Handle messages in Netty without delimiters and message length在 Netty 中处理消息,没有分隔符和消息长度
【发布时间】:2020-10-02 16:37:08
【问题描述】:

是否可以在没有任何分隔符和消息长度知识的情况下使用 netty? 我有以下 ByteToMessageDecoder 实现:

@RequiredArgsConstructor
public class MessageDecoder extends ByteToMessageDecoder {

    private static final String ENCODING = "ascii";

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List out) throws UnsupportedEncodingException {

        if (!byteBuf.isReadable()) {
            return;
        }
        byte[] bytes = new byte[byteBuf.readableBytes()];
        byteBuf.readBytes(bytes);

        String outString = new String(bytes, ENCODING);
        System.out.println(outString);

        out.add(outString);
    }
}

问题是 byteBuf 在读取时可能不包含整个消息。因此,消息可能会被拆分为多个消息。 有办法处理吗?

【问题讨论】:

  • 您好,如果我的回答对您有帮助,请采纳 :)。如果您自己弄清楚了,请发布您自己的答案。编程愉快!
  • 我认为你的问题可以使用ReplayingDecoderlink来解决

标签: java netty delimiter


【解决方案1】:

来自 ByteToMessageDecoder 类的documentation

一般帧检测 应该通过添加一个在管道的早期处理 DelimiterBasedFrameDecoder、FixedLengthFrameDecoder、 LengthFieldBasedFrameDecoder 或 LineBasedFrameDecoder。

如果需要自定义帧解码器,则需要小心 使用 ByteToMessageDecoder 实现一个时。确保有 通过检查缓冲区中有足够的字节用于一个完整的帧 ByteBuf.可读字节()。如果没有足够的字节来完成 帧,返回而不修改阅读器索引以允许更多字节 到达。

所以是的,有一种方法可以处理它,您必须使用文档第一段中列出的一个帧解码器(它们是 ByteToMessageDecoder 的子类),或者创建自己的自定义解码器。如果您创建自己的自定义解码器(扩展了 ByteToMessageDecoder),请确保在整个消息到达之前不要增加缓冲区的读取器索引。

现在在文档中进一步说明:

要在不修改阅读器索引的情况下检查完整帧,请使用 ByteBuf.getInt(int) 等方法。一个必须使用读者索引时 使用像 ByteBuf.getInt(int) 这样的方法。例如调用 in.getInt(0) 假设帧开始于 缓冲区,但并非总是如此。使用 in.getInt(in.readerIndex()) 而是。

这应该提供您创建自己的自定义帧解码器所需的所有成分。

【讨论】:

  • 嗨,这很容易说:“或创建您自己的自定义解码器”? 正如我已经说过的,没有长度或刻度。假设我们有以下消息: 1. Hello world 2. Good 3. 第三条消息 在缓冲区中它看起来像:“Hello worldGoodthird message”。我不知道如何分开它。也许,这样做的唯一方法是从传输层(TCP)获取数据长度,但我不确定这可以通过 Netty 完成。看来我将不得不放弃 Netty 并考虑另一个框架,因为它需要存在任何包含帧的应用程序协议?
  • @AlexanderSpreys 抱歉,我误解了你的问题。我认为您是对的,因为 IP 分段是不可能的。也许您可以实现一些基于时间的解决方案,但这不是很可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2014-10-07
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多