2016-06-20 12 views
1

Java 7のnio2 AsynchronousSocketChannelを使用して、CompletionHandlersを使用して読み取りと書き込みの操作を実行しています。まず、書き込み操作でByteBufferを完全に書き出すことが保証されているかどうかを知りたいと思います。部分書き込みの場合、CompletionHandlerを使用すると、ByteBufferを完全に書き出すことができます。多分再帰を使用していますか?NIO2 AsynchronousSocketChannel CompletionHandlerを使用して完全に読み取り/書き込み

同じことが読んでいます。私はAsynchronousSocketchannelからメッセージ全体を完全に読み込むことが保証されていますが、部分的な読み込みも可能です。そうであれば、CompletionHandlersを再び使用して、完全な読み取り操作を行うハンドラをどのように記述できますか? readwrite操作の

よろしくお願いします フランシス

+1

がTCPでメッセージのようなものはありません。

はあなたには、いくつかの残りのスペースがある限り、read/write操作を繰り返す必要が確実に完全な読み取り/書き込みを行うには/バッファ内のバイト。これはバイトストリームです。したがって、両方の質問に対する答えは「いいえ」です。 – EJP

答えて

1

なしを書いたり、バッファの全内容を読むことが保証されていません。彼らは、読み込み操作のために基礎となるソケットで利用可能なものを読み書きするか、またはオペレーティングシステムが書き込み操作のためにバッファにどれくらい入れることができるかだけを読み書きします。

ByteBuffer buffer = ByteBuffer.allocate(full_size_I_do_expect); 
channel.read(buffer, null, 
    new CompletionHandler() { 
     @Override 
     public void completed(Integer result, Object attachment) { 
      if (result < 0) { 
       // handle unexpected connection close 
      } 
      else if (buffer.remaining() > 0) { 
       // repeat the call with the same CompletionHandler 
       channel.read(buffer, null, this); 
      } 
      else { 
       // got all data, process the buffer 
      } 
     } 
     @Override 
     public void failed(Throwable e, Object attachment) { 
      // handle the failure 
     } 
}); 
+0

result = 0は接続クローズを意味するものではなく、0バイトは正常に読み取られる可能性があります。-1は接続クローズを意味します。 – Artyom

+0

@ArtyomNikolaev:まあ、実際はそうではありません、0バイトの読み取り要求があった場合にのみ起こります。これは通常プログラム内のバグを意味します(おそらく無限ループにつながるので、とにかく接続を強制する方が安全かもしれません:-))。しかし、あなたが正しいです、接続のコメントが正確ではなかった、私はコードを更新しました。 –

+0

'result == 0'はあなたが受け取ったよりも速く読んでいることを示しているだけではありませんか?私はまだこの非同期NIOコードのいくつかを回避しようとしています。まだ読んでいるものがなければ、単純にゼロバイトで完了ハンドラを実行するように見えます。これは、より多くのバイトを取得するまで、またはEOSを取得するまでループしますか? Javaドキュメントでは、「rが0の場合、読取り操作はI/O操作を開始せずに0の結果で直ちに完了します」[JavaDoc](https://docs.oracle.com/javase/7/docs/) api/java/nio/channels/AsynchronousSocketChannel.html) – iZian

関連する問題