java - 2つのノード間の二重接続を回避するにはどうすればよいですか?

java networking tcp

各ノードが最初に1つのネイバーとの接続を確立した(Javaを使用した)p2pプロトコルをシミュレートする必要があります。次に、ディスカバリアルゴリズムを使用して、各ノードは新しい潜在的なネイバーを見つけ、それらのいくつかと接続できます。

AやBなどのオーバーレイネットワークの2つのノードが互いに隣接していないと仮定します。これらが同時に存在するとどうなりますか? AはBに接続要求を送信し、BはAに接続要求を送信するため、2つのTCP接続が確立されますが、2つのうちの1つは無用です...


この問題を回避する方法はありますか?
あるいは、この問題が最悪の場合、接続をドロップする必要がないとどうすればわかりますか?


各ノードが一意のIDを持っていると仮定すると、各接続を2つのネイバーのIDに関連付けるだけで十分です。これにより、ノードはいくつかの重複する接続を見つけて排除できます。これは解決策になるかもしれませんが、重複する接続を破壊するためのより良い解決策はありますか?
答え
基本的な解決策の1つは、アウトバウンド接続とインバウンド接続を開くことが、同時に実行できない操作であることを確認することです。これには並行処理プリミティブを使用できます。

これらの操作が順次になる場合、二重リンクを回避するのは簡単です。現在開いているすべての接続(インバウンドとアウトバウンド)を追跡します。次に、インバウンド接続が要求されたときに、すでにアウトバウンド接続があるかどうかを確認します。その場合は、新しいものを拒否してください。
関連記事

java - 何かが起こったことを呼び出し側のクラスに通知する

java - GenericNackResponseException

java - 高度なAndroid UIを作成する方法は? [閉まっている]

java - JDK 1.6でのWebサービスクライアントの開発。JDK1.5.03との互換性が必要

java - 非サーバーアプリケーションへのServerSocketsの埋め込み

java - onCreateでLayoutParamsを設定できません

java - ツリーレイアウトをファイルに保持します。効果的に実装するには?

java - Javaで変数とメソッドを使用してクラスを動的に作成する方法は?

java - PDFファイルが2回ダウンロードされる-IE8

java - 複数のジェネリックパラメーターを取るメソッドでJavaジェネリックワイルドカードを使用するにはどうすればよいですか?