2017-08-15 34 views
0

我試圖實現UDP客戶端和來回發送消息的服務器。互聯網上的Java UDP客戶端/服務器不起作用

我的服務器在端口6060上的本地IP上設置,而我的客戶端在端口6061上的本地IP上設置爲101.兩個端口都在路由器(UDP)上轉發。我使用一些在線工具測試了這些端口,並確認這些端口是開放的。

服務器通過偵聽啓動,意味着客戶端將發送第一條消息。當客戶端通過端口6060將消息發送到本地IP.215時,通信按預期工作。但是,當它發送到互聯網IP時,使用相同的端口,服務器不會收到任何消息。我不懂爲什麼。

下面是我的客戶端代碼:

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()); 
    } 
} 

下面是我的服務器代碼:

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); 
    } 
} 

我例如去除不必要的代碼控制檯打印等,使其更具可讀性。

任何想法,爲什麼它不起作用,即通過互聯網IP發送消息?

回答

1

您的路由器不使用NAT反射,這是路由器允許通過本地網絡內部的公共IP地址(內部使用端口轉發規則)訪問服務的功能。

+0

你說得對。我的路由器不允許你用它來描述NAT。它有一個DNS功能,所以我爲我的服務器創建了一個主機名。它現在有效!謝謝。 –