0

次の基本的なサーバー/クライアントJavaコードがあります。これは、サーバーとクライアントが同じネットワークにある場合に機能します。-

  1. 同じルーターを介して接続されています。

  2. Wifi経由でサーバーに直接接続されているクライアント。

必要な使用例:クライアントはサーバーのIP /ポート(ローカルまたはインターネット上のどこにでもある可能性があります)を知っています。クライアントはバイト配列をサーバー(ポートをリッスンしている)に送信します。サーバーは受信したバイト配列を処理します。

コードは次のとおりです(関連するスニペットのみ、ここではtry-catchブロックを省略):

Server.java

public static final int SERVERPORT = 4444;
byte[] inBuffer = new byte[1024];
int bytes

ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Socket client = serverSocket.accept();
InputStream inputStream = client.getInputStream();

bytes = inputStream.read(inBuffer);

/* now process input */

Client.java

OutputStream tmpOut;


/* Server IP and PORT are known to the client, manually entered by user */
InetAddress serverAddress = InetAddress.getByName(ServerIP);
serverSocket = new Socket(serverAddress,SERVERPORT);
tmpOut = serverSocket.getOutputStream();
tmpOut.write(buffer);

これは、サーバーがクライアントと同じネットワークにある場合に機能します。ただし、サーバーを別のネットワークに接続し、クライアントを別のネットワークに接続してから、サーバーのパブリックIPを使用して上記のクライアントコードを実行すると、サーバーに接続されません。

これらの前の質問は、クライアント側ルーターがサーバーを見つけることができず、サーバーがそのポートを転送する必要があることを示唆しています。

非ローカルIPへのソケットリスナー

ソケットとの非ローカル接続

WAN上のソケットサーバー

質問(素朴で基本的な場合があります):

  1. ポートフォワーディングやJavaを使用せずにこれを行う方法はありますか?

  2. ポート転送が必要な場合、サーバーコード内からアプリケーションポートを転送するにはどうすればよいですか。私のユーザーは自分のマシンにサーバーコードをインストールするので、ユーザーが手動でポートを転送するのに苦労することはありません。

  3. GoogleやStackoverflowなどの既知のサーバーは、ランダムなクライアントからの着信ストリームをどのようにリッスンしますか。これらのサーバーは、私が投稿した上記のサーバーコードと(概念的に)どのように異なりますか?

  4. バイト配列を受信するためだけに、サーバーをパブリックWebサーバーとして実装する必要がありますか?

コードでない場合は、概念的な洞察を高く評価します。ありがとう!

4

1 に答える 1

0

Java経由でNATを検索したところ、SOで次の回答が見つかりました。

NATを介したソケット

上記は私を穴あけに導きました。この質問への回答で、ホールパンチングとファイアウォール、NATに関するより概念的な情報を見つけました。

ホールパンチングとNAT

上記の議論に基づくその他のリソース:

NAT全体のP2P

これらのリソースは、私が概念を完全に理解するのに役立ちました。完了したら、コードをJavaで投稿します。

ありがとうpaulsm4

于 2013-01-03T20:17:46.117 に答える