練習では、接続を待ち受け、ソケットを受け取り、ソケットをBlockingQueueにスローするスレッドを持つサーバーを実装する必要があります。プール内のワーカー・スレッドのセットは、キューを通過し、ソケットを介して入ってくるリクエストを処理します。Java:スレッドよりも多くの接続をキューを使って管理する
各クライアントはサーバーに接続し、多数の要求(次の要求を送信する前に応答を待っている)を送信し、完了すると結局切断します。
私の現在のアプローチは、各ワーカースレッドが待ち行列で待機し、ソケットを取得してから1つの要求を処理し、最後に(別のクライアントからの)別の要求を処理する前に。ワーカースレッドより多くのクライアントが存在するため、多くの接続がキューに入れられます。
このアプローチの問題:クライアントが何も送信しなくても、スレッドはクライアントによってブロックされます。可能な疑似ソリューション、すべてに満足のいくものではない:
inputStream
上のコールavailable()
、それは問題は0を返す場合、キューにバック接続を置く:これは、クライアントがまだ接続されているかどうかを検出することは不可能です。- 上記のとおり、クライアントがまだ接続されているかどうかを調べるには、
socket.isClosed()
またはsocket.isConnected()
を使用します。問題:どちらの方法でもEJPによってうまく説明されているように、クライアントのハングアップは検出されません。Java socket API: How to tell if a connection has been closed? - クライアントが読み取りまたは書き込みを行っている場合にプローブが表示されます。問題:ブロックを読み込む(つまり、非アクティブなクライアントがキューをブロックする元の状態に戻す)書き込みは実際にクライアントに何かを送信し、テストを失敗させる。
この問題を解決する方法はありますか?私。切断されたクライアントと受動クライアントを区別することは可能ですか?
私が正しく理解していれば、IOをブロックすることとは何の関係もありません。問題を解決するためにavailable()という質問が使用されています。むしろ、問題は、クライアントが予期せずシャットダウンしたのか、それとも静かなのかを判断する方法です。 NIOを使うことはこれを助けません。 –
私はより大きなクエリ 'このアプローチの問題:クライアントが何も送信しなくてもスレッドはクライアントによってブロックされます。 'に対処しようとしていました。接続されていないクライアントが両方のモデルに存在しますが、少なくともNIOではそれらを待っていません – ptomli
available()いいえを使用しても同じですか?まだ待っていない。 –