Netty 4.0 - StringDecoder和ChannelInboundMessageHandlerAdapter <string>无法正常工作</string>

时间:2013-05-23 03:26:47

标签: java netty

我正在使用netty 4.0.0-CR3,遵循服务器端的示例: https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/telnet/TelnetServerPipelineFactory.java

我按如下方式构建了我的管道:

private static final StringDecoder DECODER = new StringDecoder(CharsetUtil.UTF_8);

@Override
public void initChannel(SocketChannel ch) throws Exception {
    ChannelPipeline pipeline = ch.pipeline();
    pipeline.addLast("decoder", DECODER);
    // and then business logic
    pipeline.addLast("serverHandler", new ServerHandler());
}

和处理程序:

public class ServerHandler extends ChannelInboundMessageHandlerAdapter<String> {

private static final Logger LOGGER = LoggerFactory.getLogger(ServerHandler.class);

public void messageReceived(ChannelHandlerContext ctx, String request)
        throws Exception {
    // Displays the message
    LOGGER.info("Received: " + request);
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
        throws Exception {
    LOGGER.error("Unexpected exception from downstream.", cause);
    ctx.close();
}

}

我创建了一个简单的C#客户端,它将String编码为字节,然后发送到服务器。但是,我没有看到EITHER StringDecoder的decode()OR处理程序的messageReceived()被调用。

然后我删除了管道中的StringDecoder(),并将处理程序更改为:

public class Handler extends ChannelInboundByteHandlerAdapter {

@Override
protected void inboundBufferUpdated(ChannelHandlerContext ctx, ByteBuf in)
        throws Exception {
    System.out.println("called " + in.toString(CharsetUtil.UTF_8));

}

}

现在它正常运作。功能上两条管道都应该正常工作?为什么第一个设置不起作用?客户端代码是相同的。

非常感谢!

2 个答案:

答案 0 :(得分:1)

StringDecoder的文档明确指出,如果通过流连接(例如TCP)使用它,它必须与ByteToMessageDecoder一起使用。您引用的示例在StringDecoder前面有这样的处理程序。

答案 1 :(得分:0)

谢谢你们!所以我添加了以下内容:

pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.nulDelimiter()));

直到我在C#中明确地将'\ 0'添加到String的结尾时,这仍然无效:

ASCIIEncoding encoder = new ASCIIEncoding();
int index = random.Next(0, 2);
byte[] buffer = encoder.GetBytes(list[index] + "\0");

奇怪的是,我之前使用的是Netty 3.6,即使没有FrameDecoder,一切都运行良好(只有StringDecoder存在/客户端代码相同)但现在我必须执行上述步骤才能使其工作。 .........?