LAN 範囲で完全に動作する Java の P2P プログラムを完成させましたが、よく知られている NAT トラバーサルの問題に行き詰まりました。ユーザーが NAT 境界を通過して相互に接続できるようにしたい (それについて 100% を把握することは不可能であることはわかっています)。私はこのテーマについて多くのことを読みましたが、概念は理解できましたが、TCP ホール puching を行うことにまだ疑問を持っています。
私がやりたいのは、2 つのクライアントを相互に接続することです (それらは同じ NAT の下に存在します)。IP はそれぞれ192.168.100.1と192.168.100.2です(相互に直接接続できます)。最初に、ポート 80 のソケットを介して PHP サーバーに接続します。サーバーは、そのパブリック IP とポートを次のように登録します。
クライアント 1: 200.000.000.1:1478
クライアント 2: 120.000.000.1:2547
そして、各クライアントの Java ソケットは、接続時に次のように返します。
クライアント 1:ソケット[addr=/xx.xx.xx.xx,port=80,localport=54632]
クライアント 2:ソケット[addr=/xx.xx.xx.xx,port=80,localport=41789]
Id est、ポート 80 を介してサーバーと開いている 2 つの tcp 接続を超えて、各クライアントのプライベート ip、パブリック ip、ローカル ポート、およびパブリック ポートも持っています。それでは、それが私の問題です。これからどう進めばいいのかわからない。私が読んだことは、このステップについて私にはあまり明確ではありませんでした.
2 つのクライアントがパブリック ポート ( 1478-2547 ) またはローカル ポート ( 54632-41789 ) でリッスンする必要がありますか? 同時に、相手のパブリックまたはプライベートに接続しようとしますか? 他に何個のソケットを開く必要がありますか? いくつかのテストを行いましたが、何かがおかしいと思います ( *接続が拒否されました* )。
どんな助けでも大歓迎です。