2017-05-14 31 views
-2

SocketChannel.writeSocketChannel.readを同時に2つの異なるスレッド(Android APIレベル25)で使用しようとしています。読み込み中にJava SocketChannelの書き込みがブロックされる

私はブロックモードとしてSocketChannelを設定しました。

// Make socketChannel.read() return after 500ms at most 
socketChannel.socket().setSoTimeout(500); 
while(!SHUTDOWN) { 
    int read = socketChannel.read(buffer); 
    if(read > 0){ 
     // Do something nice 
     break; 
    } 
} 

と書き込みのために、私は各10秒のデータを書き込む:

は読書のために、私は、サーバーからすべてを読むために無限ループを作成しました。

問題は、時には(私は読書スレッドを各ループで短期間スリープさせる、例えば100msとすると、この問題は明らかに現れないことがわかった)読み込み中に書き込み操作がブロックされた。

AFAIK、TCP接続は、双方向動作を同時に提供できます。誰でもこれを説明できる?

+0

'read()'メソッドが返す情報は完全に無視されています。それをしないでください。 – EJP

+0

申し訳ありませんが、@EJP、これは私がループでデータを読み取っていることを示すためのデモです – MrROY

+0

この質問をd​​ownvoteする人がなぜ説明できるのはいいでしょう – MrROY

答えて

0

としてはTCP Wikipedia - Flow Controlで説明:TCP受信機が受信して確実に処理 それをするため

TCPは 送信者が速すぎてデータを送信することを回避するために、エンドツーエンドのフロー制御プロトコルを使用します。さまざまなネットワーク速度のマシンが通信する環境では、フロー制御のメカニズムが不可欠です。 の例では、PCが受信データを遅く処理するスマートフォンにデータを送信する場合、スマートフォンは が圧倒されないようにデータフローを調整する必要があります。

+0

ありがとう、しかし、これは、読みが書き込みをブロックする理由を説明していません – MrROY

+0

読み手があまりにも遅く読むと、読み手をブロックします。 – Aubin

関連する問題