プロジェクトのコア NIO サーバー ネットワーク コードを書き直しています。また、将来の使用のために接続情報をいつ「保存」する必要があるかを把握しようとしています。たとえば、クライアントが通常の方法で接続すると、その接続されたクライアントの SocketChannel オブジェクトを保存して関連付け、いつでもそのクライアントにデータを書き込めるようにします。通常、クライアントの IP アドレス (ポートを含む) を、SocketChannel オブジェクトにマップする HashMap のキーとして使用します。そうすれば、IP アドレスを簡単に検索して、その SocketChannel を介してデータを非同期に送信できます。
これは最善の方法ではないかもしれませんが、うまくいきます。プロジェクトが大きすぎて、基本的なネットワーク コードを変更することはできませんが、提案を検討します。ただし、私の主な質問は次のとおりです。
将来の使用のために、どの時点で SocketChannel を「保存」する必要がありますか? 接続が (OP_ACCEPT を介して) 受け入れられると、SocketChannel への参照を保存しています。OP_READ イベントが発生したときにマップ エントリが既に存在していると想定できるため、これは効率的なアプローチだと思います。そうしないと、OP_READ が発生するたびに計算コストの高い HashMap のチェックを行う必要があり、それは明らかです。 OP_ACCEPT よりも多くのクライアントが発生します。私の懸念は、受け入れられる (OP_ACCEPT) がデータをまったく送信しない (OP_READ) 接続が存在する可能性があることです。これは、ファイアウォールの問題、またはクライアントまたはネットワーク アダプターの誤動作が原因である可能性があります。これにより、アクティブではなく、近いメッセージを受信しない「ゾンビ」接続が発生する可能性があると思います。
ネットワーク コードを書き直す理由の 1 つは、まれにクライアント接続が異常な状態になることがあるからです。接続が「有効」であり、保存できると仮定するために使用する情報を含め、OP_ACCEPT と OP_READ を処理した方法が間違っている可能性があると考えています。
申し訳ありませんが、私の質問は具体的ではありません。SocketChannel が本当に有効であるかどうかを判断するための最良かつ最も効率的な方法を探しているだけなので、それへの参照を保存できます。助けてくれてどうもありがとう!