for (int i = 1; i <= 100; i++) {
ctx.writeAndFlush(Unpooled.copiedBuffer(Integer.toString(i).getBytes(Charsets.US_ASCII)));
}
ctx.writeAndFlush(Unpooled.copiedBuffer("ABCD".getBytes(Charsets.US_ASCII))).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
ctx.channel().close();
}
});
これをnettyサーバーハンドラーのchannelRead()メソッドに書き込むと、サーバーがリクエストを受信するとすぐに「12345 ... 100ABCD」がクライアントに返されます。
私が見る限り、nettyサーバーから受信したメッセージクライアントの順序は常に「12345 ... 100ABCD」です。
たまたまこれなのかわからない?たぶんいつかそれは「32451 ... ABCD100」(サーバーの書き込み順序から外れている)になるでしょうか?
サーバーが実行する可能性はありますか
clientChannel.writeAndFlush(msg1);
clientChannel.writeAndFlush(msg2);
clientChannel.writeAndFlush(msg3);
しかし、クライアントはmsg2-msg1-msg3またはmsg3-msg1-msg2を受信しましたが、書き込み順序msg1-msg2-msg3は受信しませんでした
nettyプロジェクトのプロキシサンプルでは、https://github.com/netty/netty/tree/master/example/src/main/java/io/netty/example/proxy
HexDumpProxyBackendHandlerは次のように書き込みます。
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
inboundChannel.writeAndFlush(msg).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (future.isSuccess()) {
ctx.channel().read();
} else {
future.channel().close();
}
}
});
}
wirteAndFlush()操作が終了した場合にのみ、次のchannelRead()(channelRead()のinboundChannel.writeAndFlush(msg))をトリガーするようにします。
では、リスナーにctx.channel()。read()を記述し、future.isSuccess()のときに実行する目的は何ですか?クライアントに書き込まれたメッセージが正しい順序で受信されることを確認するためではありませんか?
に変更すると
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
inboundChannel.writeAndFlush(msg);
ctx.channel().read();
}
それはいくつかの問題を引き起こしますか?
いいえ、できません。TCPはそれを保証します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加