サーバー側の例に従って、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();
}
}
String をバイトにエンコードしてサーバーに送信する単純な C# クライアントを作成しました。ただし、StringDecoder の decode() またはハンドラーの 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));
}
}
現在、正常に動作しています。機能的には、両方のパイプラインが正しく機能するはずですか? 最初のセットアップが機能しないのはなぜですか? クライアントコードは同じです。
どうもありがとう!