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 来获取这个对象(它类似于示例在用户指南中)。

谢谢你的帮助再见

4

1 回答 1

0

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

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

 if (stripDelimiter) {
            frame = buffer.readBytes(minFrameLength);
            buffer.skipBytes(minDelimLength);
        } else {
            frame = buffer.readBytes(minFrameLength + minDelimLength);
        }
于 2011-08-28T17:33:24.327 回答