2017-08-15 16 views
0

メッセージを前後に送信するUDPクライアントとサーバーを実装しようとしています。インターネット経由でJava UDPクライアント/サーバーが動作しない

私のサーバはポート6060のローカルIP .215に設定され、クライアントはポート6061のローカルIP .101に設定されます。両方のポートはルータ(UDP)に転送されています。いくつかのオンラインツールを使用してポートをテストし、ポートが開いていることを確認しました。

サーバーはリッスンによって開始します。つまり、クライアントは最初のメッセージを送信します。クライアントがメッセージをポート6060のローカルIP .215に送信すると、意図したとおりに通信が行われます。ただし、同じポートを使用してインターネットIPに送信すると、サーバーは何も受信しません。私はなぜなのか理解していない。私は、例えば、不要なコードを削除

public static void main(String[] args) throws IOException { 
    DatagramSocket serverSocket = new DatagramSocket(null); 
    InetSocketAddress serverAddress = new InetSocketAddress("192.168.1.215", 6060); 
    serverSocket.bind(serverAddress); 
    byte[] receiveData = new byte[504]; 
    byte[] sendData = new byte[504]; 
    while (true) { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     serverSocket.receive(receivePacket); 
     String sentence = new String(receivePacket.getData()); 
     InetAddress IPAddress = receivePacket.getAddress(); 
     int port = receivePacket.getPort(); 
     String capitalizedSentence = sentence.toUpperCase(); 
     sendData = capitalizedSentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
     serverSocket.send(sendPacket); 
    } 
} 

:以下

public static void main(String args[]) throws Exception { 
    DatagramSocket clientSocket = null; 
    clientSocket = new DatagramSocket(null); 
    clientSocket.bind(new InetSocketAddress("192.168.1.101", 6061)); 
    InetAddress serverIPAddress = InetAddress.getByName("my.internet.ip"); 
    int serverPort = 6060; 
    byte[] sendData = new byte[504]; 
    byte[] receiveData = new byte[504]; 
    while (true) { 
     String sentence = "A" + Double.toString(Math.random()) + "A"; 
     sendData = sentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIPAddress, serverPort); 
     clientSocket.send(sendPacket); 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     clientSocket.receive(receivePacket); 
     String modifiedSentence = new String(receivePacket.getData()); 
    } 
} 

は、サーバーのための私のコードです:以下

は、クライアントのために私のコードですそれをもっと読みやすくするためにコンソールに印刷します。

インターネットIPを介してメッセージを送信する理由は何ですか?

答えて

1

ルータは、ルータが(ポート転送ルールを内部的に使用して)ローカルネットワーク内からパブリックIPアドレスを使用してサービスにアクセスできる機能であるNATリフレクションを使用しません。

+0

あなたはそうです。私のルーターはあなたがそれを記述する方法でNATを許可しません。 DNS機能があるので、自分のサーバーのホスト名を作成しました。それは今働きます!ありがとう。 –

関連する問題