投稿された他の回答が表示されますが、ゲームをプレイしているクライアントと対話していると思うので、別のアプローチを提案するかもしれません(場合によっては BufferedReader が確実に有効です)。
必要に応じて...「登録」の責任をクライアントに委任できます。つまり、それぞれから受信した最後のメッセージのタイムスタンプを持つ接続ユーザーのコレクションを持つことになります...クライアントがタイムアウトした場合、クライアントの再登録を強制しますが、それは以下の引用とアイデアにつながります.
ソケットが閉じられているかどうかを実際に判断するには、データを出力ストリームに書き込み、例外をキャッチする必要があることを読みました。これは、この状況を処理するための本当に不潔な方法のようです。
Java コードがソケットを閉じたり切断したりしなかった場合、リモート ホストが接続を閉じたことを他にどのように通知しますか? 最終的に、try/catch は、ACTUAL ソケットでイベントをリッスンするポーラーとほぼ同じことを行っています。次の点を考慮してください。
- あなたのローカルシステムはあなたに通知せずにソケットを閉じることができます...それは単なるSocketの実装です(つまり、状態の変化のためにハードウェア/ドライバー/ファームウェアなどをポーリングしません)。
- new Socket(Proxy p)...接続を閉じている可能性のある複数の当事者(実際には6つのエンドポイント)があります...
抽象化された言語の特徴の 1 つは、細かな点から抽象化されていることだと思います。C# の using キーワード (try/finally) を SqlConnection s などに使用することを考えてみてください...それは単にビジネスを行うためのコストです... try/catch/finally は、Socket の使用に受け入れられ、必要なパターンだと思います。