【问题标题】:Java UDP client/server over internet does not work互联网上的 Java UDP 客户端/服务器不起作用
【发布时间】:2017-08-15 22:35:43
【问题描述】:

我正在尝试实现一个来回发送消息的 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);
    }
}

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

任何想法为什么它不起作用,即通过互联网 IP 发送消息?

【问题讨论】:

    标签: java sockets networking udp


    【解决方案1】:

    您的路由器不使用 NAT 反射,这是路由器允许从本地网络内部通过公共 IP 地址访问服务的功能(内部使用端口转发规则)。

    【讨论】:

    • 你是对的。我的路由器不允许按照您描述的方式进行 NAT。不过它有一个 DNS 功能,所以我为我的服务器创建了一个主机名。现在可以了!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多