有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java UDP聊天程序不同网络不能聊天

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

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

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

这是我的代码:

客户:


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

    }
}

当代码仅更改为localhost时,该代码才起作用

有人知道我做错了什么吗?非常感谢您的回复


共 (1) 个答案

  1. # 1 楼答案

    假设客户端连接到服务器,服务器需要指定要侦听的端口,客户端需要指定服务器的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或者自己实现这些功能