2012-01-09 21 views
2

サーバー側の各接続にスレッドがあります。クライアントがコマンドを送信していない場合は、サーバーのスレッドがブロックしている:内部TCPソケットから得たOutputStream上のreadLine()を呼び出すクライアントに知らせる間にサーバー側からTCP接続を閉じる

while ((commandHeader = fromNode.readLine()) != null) { 

を。 別のスレッドからsocket.close()を呼び出すと、この呼び出しはSocketExceptionで起動し、スレッドは終了できます。クライアントが起動し、コマンドを発行することを決定した場合よりも

しかし、それは無期限

stream.writeBytes("something\n"); 

ブロックを実行します。私はこれがおそらくTCPのためにうまくいくことを理解しています(それはほんの半分です)。 "QUIT \ n"のように、終了時におそらくクライアントに何かを送るべきです。 EOFを読むこともできます。しかし、私がコマンドを送る前にクライアント上でreadLine()やその他の読み取り操作を呼び出すと、接続が閉じられていないときにデータ待ちをブロックします。 クライアントは、接続をハーフクローズしてから書き込みを試行する方法をどのように検出できますか?

答えて

2

まず、あなたのアプリケーションロジックは、ハーフオープンTCP接続を避けるようなものでなければならないと思います。何も受信しなければ、サーバーを再びポーリングし始めるように、クライアント側にタイマーを追加することを考えることができます。

サーバーの観点からは、もう1つのオプションは、readLineにタイマーを設定することです。タイマーを設定するreadLineの別のメソッドを作成し、一定の時間を過ぎた場合は、いくつかのデフォルト値をwhileループに返します。

EDIT:何IOにブロックされたスレッドについて:

あなたはread this article特別セクションにしたいのでしょうか? socket.close()がサーバー上で呼び出された

3

は、基礎となるTCP接続は、典型的なFIN/FIN-ACKシーケンスプラスRSTパケットで閉じられているので、クライアントを知っています。後でクライアントがstream.writeBytes()を呼び出すと、失敗するはずです。そうでなければ、欠落しているパケットがあることを意味し、最終的には接続に失敗します。

関連する問題