ネットワーク クラス用の Java チャット アプリケーションを作成しようとしています。現在、別のルーターの背後にいる誰かに接続しようとして立ち往生しています。私が現在プロジェクトを持っている方法は、クライアント プログラムとサーバー プログラムを持っていることです。クライアント プログラムは最初にサーバー プログラムにログインし、サーバー プログラムは IP とポートをデータベースに記録します。次に、サーバーは友人のリストと IP とポートを返します。次に、クライアントはサーバーへの接続を閉じ、サーバーが送り返した情報を使用して別のクライアントに接続しようとします。これまでのところ、私のプログラムはサーバーに接続して友人のIPとポートを取得するだけで機能しますが、それらの値を使用して他のクライアントに接続すると接続できません。
socket = new Socket();
socket.setReuseAddress(true);
socket.setKeepAlive(true);
socket.setSoLinger(true, 10);
socket.bind(new InetSocketAddress(Port));
socket.connect(new InetSocketAddress(host, SERVER_PORT));
reusePort = socket.getLocalPort();
上記はサーバーへの接続に使用される Java コードのスニペットであり、以下はクライアント側で行うことです。
ss = new ServerSocket(reusePort);
したがって、技術的には、サーバーへの接続に使用したのと同じポートでリッスンしています。このポートは、ログインしており、別のクライアントから取得でき、IP とポートを含む NAT テーブルにあります。何が欠けているのか、何かプロトコルがあるのか 、私がしなければならないことがあるのかわからない. 私は TCP と UDP のホール パンチングを見てきましたが、それが実際にどのように達成されるか、またはどのように実装するかはわかりません。
任意の提案をいただければ幸いです。