1

Java で TCP/IP を使用してチャットするためのアプリケーションを開発しました。これまでのところ、サーバーとクライアントを同じマシンで実行しているときに機能しますが、LAN経由で機能させたいと考えています。

クライアントとサーバーで使用しているのと同じポートに対して、ルーターでポート転送を使用し、それをマシンのIP(サーバー)に転送することがわかりました。また、ファイアウォールに注意する必要があることもわかりました。

未使用のメディア ハブ ルーターでは、(4444) を使用してポートを転送し、TCP プロトコルを使用してマシンのローカル IP (192.168.0.21) に転送しました。また、ポートがブロックされていないことも確認しました。

ファイアウォールについては、Windows ファイアウォールが有効になっていないことを確認し、カスペルスキー ウイルス対策ファイアウォールをオフにしました。

これまでのところ、VMware マシンと LAN 経由で通信することはできませんでした。

ソケットとサーバーソケットのコードは次のとおりです。

クライアント:

int portNumber = 4444;
InetAddress host = InetAddress.getLocalHost(); // I also did try changing the host to a String and making host = InetAddress.getLocalHost().getHostAddress();
Socket link = new Socket(host, portNumber);

サーバ:

int portNumber = 4444;
ServerSocket serverSocket = new ServerSocket(portNumber);
link = serverSocket.accept();

私が間違っていること、または何かが欠けていることは何か分かりますか?

4

1 に答える 1

2

そのコード ( InetAddress host = InetAddress.getLocalHost();) を使用すると、クライアント側は常に localhost に接続しますが、それは明らかに望んでいるものではありません (ただし、ローカルで動作する理由の説明...

クライアント/サーバー通信に関する公式のOracle チュートリアルを提案してもよろしいですか?

リモート システムの IP アドレスが 192.168.0.100 であるとすると、コードは次のようになります。

int portNumber = 4444;
String host = "192.168.0.100"; // Socket also has a constructor that accepts
                               // as String where you can either input a hostname or
                               // an IP address
Socket link = new Socket(host, portNumber);

ソケットJavadocはこちら

EDIT:あなたのプログラムの主な欠陥は、 JavadocInetAddress.getLocalHost()に従って whichを使用することです

ローカル ホストのアドレスを返します。これは、システムからホストの名前を取得し、その名前を InetAddress に解決することによって実現されます。

鉱山を強調します。そうです、プログラムはローカル コンピューターでは動作しますが、リモート コンピューターでは動作しません。私の答えの本質は、文字列を使用することではなく、ローカルホストを使用しないことです...

于 2013-10-29T15:55:09.793 に答える