Java 框架解码器,它是如何工作的?
我预感到我是netty的新手;我正在尝试为外部服务器创建一个客户端,该服务器输出以0x0d结尾的消息,因此我决定使用DelimiterBasedFrameDecoder来处理这些消息 这只是对处理程序的测试: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
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);
}