簡體   English   中英

互聯網上的Java UDP客戶端/服務器不起作用

[英]Java UDP client/server over internet does not work

我正在嘗試實現來回發送消息的UDP客戶端和服務器。

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

服務器通過偵聽開始,這意味着客戶端將發送第一條消息。 當客戶端將其消息發送到端口6060上的本地IP .215時,通信將按預期進行。但是,當客戶端使用相同的端口將其消息發送到Internet 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);
    }
}

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

有什么想法為什么它不起作用,即通過Internet IP發送消息?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM