1

サーバー側の例に従って、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));

}

}

現在、正常に動作しています。機能的には、両方のパイプラインが正しく機能するはずですか? 最初のセットアップが機能しないのはなぜですか? クライアントコードは同じです。

どうもありがとう!

4

2 に答える 2

0

みんなありがとう!だから私は以下を追加しました:

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

そして、C# の String の最後に '\0' を明示的に追加するまで、これはまだ機能しませんでした:

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

奇妙なことに、以前は Netty 3.6 を使用していましたが、FrameDecoder がなくてもすべて正常に動作しました (StringDecoder のみが存在し、クライアント コードは同じでした) が、動作させるには上記の手順を実行する必要があります.... ……?

于 2013-05-24T02:00:24.813 に答える