次の基本的なサーバー/クライアントJavaコードがあります。これは、サーバーとクライアントが同じネットワークにある場合に機能します。-
同じルーターを介して接続されています。
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を使用して上記のクライアントコードを実行すると、サーバーに接続されません。
これらの前の質問は、クライアント側ルーターがサーバーを見つけることができず、サーバーがそのポートを転送する必要があることを示唆しています。
質問(素朴で基本的な場合があります):
ポートフォワーディングやJavaを使用せずにこれを行う方法はありますか?
ポート転送が必要な場合、サーバーコード内からアプリケーションポートを転送するにはどうすればよいですか。私のユーザーは自分のマシンにサーバーコードをインストールするので、ユーザーが手動でポートを転送するのに苦労することはありません。
GoogleやStackoverflowなどの既知のサーバーは、ランダムなクライアントからの着信ストリームをどのようにリッスンしますか。これらのサーバーは、私が投稿した上記のサーバーコードと(概念的に)どのように異なりますか?
バイト配列を受信するためだけに、サーバーをパブリックWebサーバーとして実装する必要がありますか?
コードでない場合は、概念的な洞察を高く評価します。ありがとう!