1

Java でのソケットの使用に問題があります。まず、Javaでソケットを使ってやりたいことを説明させてください。それを介してインターネット経由でラップトップを接続したい。私のラップトップにはサーバーがあり、クライアントはインターネット経由で接続する必要があります。ローカル ネットワークを処理するルーターがあり、ルーターのポートをラップトップに接続したくないため、"internet->router->localNetwork->mylaptop" というパスをたどる必要があります。問題は、インターネット IP アドレスとローカル IP アドレスの両方を使用する方法を見つけたことです。ただし、例外がスローされます。"Exception in thread "main" java.net.BindException: Address already in use"

私が試すコードは次のとおりです。

InetAddress addr = InetAddress.getByName("XXX.XXX.XXX.XXX");
InetAddress local = InetAddress.getByName("YYY.YYY.YYY.YYY");
Socket socket = new Socket(addr, 1111, local, 1111); // The line I have got exception

ルーター ポートをラップトップに導くことで、同様の目的で次のコードを実行できます。

Socket socket = new Socket("XXX.XXX.XXX.XXX", 1111);

*Xs はインターネット IP アドレスの略です

※YsはローカルIPアドレスの略

*コードはコードのクライアント側に属します

4

2 に答える 2

3

私の知る限り、NAT を使用したインターネット (WAN) IP XXX.XXX.XXX.XXX のルーターがあり、ルーターに接続されたローカル (LAN) IP YYY.YYY.YYY.YYY のラップトップがあり、あなたはそれを仮定します

Socket socket = new Socket(InetAddress.getByName("XXX.XXX.XXX.XXX"), 1111, InetAddress.getByName("YYY.YYY.YYY.YYY"), 1111);

ラップトップに接続します。それは正しくありません。

Socket使用しているクラスのコンストラクターのドキュメントには、次のように記載されています。

ソケットを作成し、指定されたリモート ポート上の指定されたリモート ホストに接続します。Socket は、指定されたローカル アドレスとポートにも bind() します。

それはあなたが望むものではありません。

このように NAT の背後にあるデバイスに接続することはできません。「ルーターのポートを導く」必要があります。

于 2013-07-21T20:09:30.737 に答える