0

AsynchronousServerSocketChannel および AsynchronousSocketChannel に基づくサーバーで、特定の IP アドレスからの接続が既に存在するかどうかを確認するにはどうすればよいですか? すでに接続されている IP アドレスからの接続に特定のメッセージを送信したい (後で再試行するように要求する; 強制ではなく共有すると帯域幅が十分に活用されない非常に特殊なクライアント側 LAN を扱っている)サーバーによってシリアル化されます)。ただし、IP アドレスのリストを取得して、同じ IP アドレスが既に接続されているかどうかを検索する方法がわかりません。ConcurrentSkipListSetのようなものに新しい接続ごとにIPアドレスを挿入する(そして閉じるときにそれらを削除する)以外に、これを行うためのよりエレガントで効率的な方法はありますか?

さらに、開いているすべての接続からいくつかのネットワーク統計を定期的に収集したいと考えています (アップロードされたファイルのチャンク数など)。これを効率的に行うために私が思いついた唯一の方法は、ConcurrentLinkedQueue を使用して (チャンク送信ネットワーク書き込みの) 完了ハンドラーから情報収集スレッドに更新を送信し、何かがキューに挿入されるたびにスレッドをウェイクアップすることです。ウェイク操作はノンブロッキングであると想定していますが、少なくともインターロックされたCPU命令が含まれていると確信しているため、どれだけ高価になるかはわかりません(これはメモリフェンスを意味し、実行速度にさらに影響を与えます等。)。他の提案はありますか?

4

1 に答える 1

0

独自のデータ構造を維持する必要があります。TCP が提供するのはソケットだけで、そこからリモート アドレスとポートを取得できます。

于 2012-09-19T09:54:08.963 に答える