2017-12-16 31 views
2

Nettyを使用してサーバーに接続されているJava TCPクライアントがあります。 切断されたチャネルに書き込むと、例外が発生します。どの問題が原因であるかは重要ではありませんが、どのメッセージがに送信されていないかが重要です。これはに送信され、例外が発生しました。どのメッセージがNettyの書き込みで例外を引き起こすかを調べるには?

どのように[ChannelPromiseまたはChannelFutureを使用して]それを見つけるか?

ここで私はちょうど 'f.isSuccess()==true'を得るが、それは成功していない!メッセージは送信されませんでした!

ChannelPromise promise = c.newPromise(); 
      promise.addListener(new ChannelFutureListener() { 
       @Override 
       public void operationComplete(ChannelFuture f) { 
        System.err.println("<TCPIn: promise write operationComplete."); 
        if (!f.isSuccess()) { 
         System.err.println("<TCPIn[writting]: promise write ERROR:"); 
         f.cause().printStackTrace(); 
         f.channel().close(); 
        } 
       } 
      }); 
channel.writeAndFlush(buf,promise); 
+0

あなたはbufオブジェクトにリスナー自体からアクセスできませんか?これはほとんどの場合に有効ですが、EJPが彼の答えで言うところの – Ferrybig

答えて

1

これは簡単ではありません。例外を引き起こしたのは、ソケット送信バッファから送信されたセグメントに対する確認応答を受信できなかったためです。特定のメッセージとの相関はゼロかもしれません。たとえば、メッセージの半分と次の半分の半分になっている可能性があります。これは、完了したばかりのメッセージではなく、前の書き込みからのデータであることは間違いありません。 TCPの「書き込み完了」は、ソケット送信バッファ内のデータのバッファリングに成功したことだけを意味することに注意してください。

+0

ではありません。どのようにメッセージが完全に送信されたかどうかを調べるには?メッセージが正常に送信されたかどうかを知りたいだけです。 –

+2

本当に何かがTCPで正常に受信されたことを確認する唯一の方法は、 "ACKメッセージ"を返送することです。これはプロトコル自体の一部であり、TCPの上に構築されます。 –

+0

@NormanMaurer私はメッセージを受け取ることについて知りたくはありません。メッセージが正常に送信されたかどうかを知りたいだけです。 –

関連する問題