DelimiterBasedFrameDecoder,它是如何工作的?

时间:2011-07-05 11:26:32

标签: java network-programming nio netty

我假装我是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获取此对象(它是类似的到用户指南中的示例。)

感谢您的帮助 再见

1 个答案:

答案 0 :(得分:0)

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

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

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