DelimiterBasedFrameDecoder,它是如何工作的?

发布于 2024-11-18 12:49:36 字数 1166 浏览 3 评论 0原文

我假设我是netty的新手;我正在尝试创建一个到外部服务器的客户端,该服务器输出以 0x0d 结尾的消息,因此我决定使用 DelimiterBasedFrameDecoder 来处理这些消息。

这只是对处理程序的测试:

public class TestHandler extends DelimiterBasedFrameDecoder {

    public TestHandler(){

        super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x0d }));

    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel ch,
            ChannelBuffer cbuf) throws Exception {


        ByteBuffer buf = ByteBuffer.allocate(cbuf.readableBytes());

        cbuf.readBytes(buf);

        byte[] data = buf.array();

        for(byte b : data){

            System.out.print(b + " ");

        }

        System.out.println();

            ...... (some other code)

     }

我从中看到的错误是它没有按照我在构造函数中指定的方式删除分隔符;在 byte[] 数据的末尾,我总是有 0x0d; 因此,就像测试一样,我更改了构造函数中的分隔符,在其上添加了一个测试值,例如 0x55

super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x55 }));

,它的工作方式相同,与之前没有区别。 我认为我以错误的方式使用它,或者我以错误的方式读取数据。 使用这个类的正确方法是什么?

需要明确的是,在这个处理程序的实际代码中,我从读取的数据创建一个对象,然后从decode()方法返回这个对象,然后我有另一个扩展SimpleChannelHandler的处理程序来获取这个对象(它类似于示例在用户指南中)。

感谢您的帮助 再见

i premiss that i am a newbie of netty; i am trying to create a client to an external server, this server outputs messages that terminates with 0x0d so i decide to use the DelimiterBasedFrameDecoder to handle these messages.

This is just a test of the handler:

public class TestHandler extends DelimiterBasedFrameDecoder {

    public TestHandler(){

        super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x0d }));

    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel ch,
            ChannelBuffer cbuf) throws Exception {


        ByteBuffer buf = ByteBuffer.allocate(cbuf.readableBytes());

        cbuf.readBytes(buf);

        byte[] data = buf.array();

        for(byte b : data){

            System.out.print(b + " ");

        }

        System.out.println();

            ...... (some other code)

     }

what i see wrong from this is that it doesn't strip the delimiter as i specified in the constructor; at the end of the byte[] data i always have the 0x0d;
So, just as test, i changed the delimiter in the constructor putting on it a test value like 0x55

super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x55 }));

and it works in the same way, there is not difference from before.
I think i am using it in the wrong way, or i am reading the data in the wrong way.
What is the right way to use this class?

To be clear, in the real code from this handler i create an object from the read data and i return this object from the decode() method, then i have another handler that extends SimpleChannelHandler that get this object ( it is similar to the example in the user guide ).

Thanks for the help
Bye

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩世 2024-11-25 12:49:36

我认为您的解码方法没有正确使用构造函数的“stripBytes”部分。

如果您检查 Netty 的 DelimiterBasedFrameDecoder 中的代码,您将在代码中看到以下 if 条件,而您重写的解码方法中缺少该条件。这导致字节不被剥离。

 if (stripDelimiter) {
            frame = buffer.readBytes(minFrameLength);
            buffer.skipBytes(minDelimLength);
        } else {
            frame = buffer.readBytes(minFrameLength + minDelimLength);
        }

I think your decode method is not using the "stripBytes" part of the constructor properly.

If you check out the code in DelimiterBasedFrameDecoder of Netty, you will see the following if condition in code, which is missing in your overriden decode method. This is causing the bytes not to be stripped.

 if (stripDelimiter) {
            frame = buffer.readBytes(minFrameLength);
            buffer.skipBytes(minDelimLength);
        } else {
            frame = buffer.readBytes(minFrameLength + minDelimLength);
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文