UDP聊天程序不同网络无法聊天

UDP Chat Program different networks can't chat

我正在尝试制作一个客户端和服务器可以在不同网络(不是本地主机)上相互聊天的聊天程序我目前遇到了一个问题我不知道如何解决。

由于某种原因,客户端和服务器无法相互连接,当我用客户端向服务器写消息时,服务器上没有弹出任何内容。测试 运行 在两台不同的计算机上,在不同的网络(移动数据和以太网)

我在代码中使用了来自我的以太网的 public ip,并在代码中使用匹配的端口号将其转发。服务器 运行 正在端口转发网络上。

这是我的代码:

客户:


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatClient {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        DatagramSocket client = new DatagramSocket(7000);

        byte[] receivedData = new byte[1024];
        byte[] sentData;

        InetAddress address = InetAddress.getByName(" PUBLIC IP IS HERE, won't show it for obvious reasons ");

        while (true) {
            String message = scanner.nextLine();
            sentData = message.getBytes();

            DatagramPacket dp1 = new DatagramPacket(sentData, sentData.length, address, 7000);
            client.send(dp1);

            DatagramPacket dp4 = new DatagramPacket(receivedData, receivedData.length);
            client.receive(dp4);

            String receivedMessage = new String(dp4.getData());
            System.out.println(receivedMessage);
        }

    }
}

服务器:


import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatServer {

    public static void main(String[] args) throws IOException {
        DatagramSocket server = new DatagramSocket();
        Scanner scanner = new Scanner(System.in);

        byte[] receivedData = new byte[1024];
        byte[] sentData;

        while (true) {
            DatagramPacket dp2 = new DatagramPacket(receivedData, receivedData.length);
            server.receive(dp2);

            String storedData = new String(dp2.getData());
            System.out.println(storedData);

            InetAddress getIP = dp2.getAddress();
            int port = dp2.getPort();

            String sentMessage = scanner.nextLine();
            sentData = sentMessage.getBytes();

            DatagramPacket dp3 = new DatagramPacket(sentData, sentData.length, getIP, port);
            server.send(dp3);
        }

    }
}

代码仅在更改为本地主机时有效。

有谁知道我做错了什么?非常感谢任何回复。

假设客户端连接到服务器,服务器需要指定监听的端口,客户端需要指定服务器的IP和端口。

客户:

InetAddress address = InetAddress.getByName(" PUBLIC IP IS HERE"); 
DatagramSocket client = new DatagramSocket();
//...
DatagramPacket dp1 = new DatagramPacket(sentData, sentData.length, address, 7000);//the port should be the publicly exposed port
client.send(dp1);

这将连接到具有指定 IP 和端口的服务器。

服务器:

DatagramSocket server = new DatagramSocket(7000);//port to forward

这意味着服务器侦听端口 7000,因此它在该端口下可用。

除此之外,请确保端口转发正常工作。如果使用UDP,还需要为TCP配置。

另请注意,UDP 既不确认也不验证包。如果您想拥有这些功能,您将需要使用 TCP 或自己实现这些功能。