Java 框架解码器,它是如何工作的?

Java 框架解码器,它是如何工作的?,java,network-programming,nio,netty,Java,Network Programming,Nio,Netty,我预感到我是netty的新手;我正在尝试为外部服务器创建一个客户端,该服务器输出以0x0d结尾的消息,因此我决定使用DelimiterBasedFrameDecoder来处理这些消息 这只是对处理程序的测试: public class TestHandler extends DelimiterBasedFrameDecoder { public TestHandler(){ super(200, true, ChannelBuffers.wrappedBuffer(n

我预感到我是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)

     }
我从中看到的错误是,它没有像我在构造函数中指定的那样去掉分隔符;在字节[]数据的末尾,我总是有0x0d; 所以,就像测试一样,我更改了构造函数中的分隔符,在其上添加了一个测试值,如0x55

super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x55 }));
它以同样的方式工作,与以前没有区别。 我认为我使用它的方式不对,或者我读取数据的方式不对。 使用这个类的正确方法是什么

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

谢谢你的帮助
再见

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

如果您在Netty的DelimiterBasedFrameDecoder中签出代码,您将在代码中看到以下If条件,该条件在重写的解码方法中丢失。这导致字节不能被剥离

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