将UDP从Java发送到Python不起作用 目标

将UDP从Java发送到Python不起作用 目标,java,python,sockets,udp,localhost,Java,Python,Sockets,Udp,Localhost,我试图通过UDP将数据从Java服务器发送到同一台机器上的Python客户机 环境 设备/OS:Jetson nano与Ubuntu 18.04.3 LTS(仿生海狸) JavaC版本:javac11.0.4 Java版本: openjdk版本“11.0.4”2019-07-16 OpenJDK运行时环境(构建11.0.4+11-post-Ubuntu-1ubuntu218.04.3) OpenJDK 64位服务器虚拟机(构建11.0.4+11-post-Ubuntu-1ubuntu218.

我试图通过UDP将数据从Java服务器发送到同一台机器上的Python客户机

环境
  • 设备/OS:Jetson nano与Ubuntu 18.04.3 LTS(仿生海狸)
  • JavaC版本:javac11.0.4
  • Java版本:
    • openjdk版本“11.0.4”2019-07-16
    • OpenJDK运行时环境(构建11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
    • OpenJDK 64位服务器虚拟机(构建11.0.4+11-post-Ubuntu-1ubuntu218.04.3,混合模式)
问题 我可以将数据从Python测试服务器(见下面的代码)发送到Python测试客户机。但是,如果我尝试将数据从Java测试服务器发送到Python测试客户机,似乎什么都没有到达。Java服务器不会抛出异常

Python中的测试客户端(工作) Python中的测试服务器(工作) Java中的测试服务器(不工作或无法到达python客户端) 问题 返回计算机的一个接口的地址

解决方案 正如@Gomiero所建议的,使用

InetAddress address = InetAddress.getByName("127.0.0.1");
// or
InetAddress address = InetAddress.getByName("localhost");
解决了此问题,因为在这种情况下,客户端绑定到
127.0.0.1
,不接受来自任何其他IP地址的数据包

注 正如@user207421所建议的,在大多数情况下,问题的正确解决方案是将客户端绑定到
0.0.0
,如下所示:

UDP_IP = "0.0.0.0"
UDP_PORT = 9999
sock.bind((UDP_IP, UDP_PORT))
将客户端绑定到
0.0.0.0
可以解决在服务器端使用
InetAddress.getLocalHost()
的问题,因为这会使客户端接受其任何IP地址的数据


但是,我最终决定现在将客户机绑定到
127.0.0.1
,并正确理解它的作用,因为我只需要本地计算机的数据。

您可以尝试将
InetAddress.getLocalHost()
更改为
InetAddress.getByName(“localhost”)
。可能getLocalHost返回的是您的网络设备地址,而不是环回地址(127.0.0.1)。其次,返回的地址可能取决于您的系统,您可以打印出来检查。有关更多信息,请参见:不要绑定到localhost。绑定到0.0.0.0。我没有建议任何这样的事情,如果您绑定到0.0.0.0,这是不必要的,这是我建议的,也是正常的做法。@user207421您是对的,对不起,这不是您的建议,我正在更改它。但是,
address=InetAddress.getByName(“0.0.0.0”)似乎不起作用。它导致
java.net.BindException:无法分配请求的地址:数据报发送失败
。我也没有这么说。我说的是绑定到0.0.0.0而不是本地主机。这里唯一绑定到localhost的是Python代码。所有其他的Java东西都被误导了。如果您没有像现在这样通过绑定阻止主机,那么您应该能够通过其任何可访问的IP地址向主机发送。@user207421谢谢,现在我明白了,我最初没有意识到我应该在客户端更改某些内容。这正是我想要的答案,因为我真的很困惑,原来的示例使用
InetAddress.getLocalHost()不起作用。但是,将客户端绑定到
127.0.0.1
正是我所需要的,因为在这种情况下,我不希望从网络中的另一台机器获取数据。我只是对精确的力学思考得不够好。。。
import java.io.*;
import java.net.*;

public class TestSender {
    public static void main(String[] args) {
        try {
            byte[]         data    = "Hello world".getBytes();
            int            port    = 9999;
            InetAddress    address = InetAddress.getLocalHost();
            DatagramPacket packet  = new DatagramPacket(data, data.length, address, port);
            DatagramSocket socket  = new DatagramSocket();

            socket.send(packet);
            System.out.println("Data sent");

            socket.close();

        } catch (Exception e) {
            System.out.println("Something went wrong");
        }
    }
}
InetAddress address = InetAddress.getLocalHost();
InetAddress address = InetAddress.getByName("127.0.0.1");
// or
InetAddress address = InetAddress.getByName("localhost");
UDP_IP = "0.0.0.0"
UDP_PORT = 9999
sock.bind((UDP_IP, UDP_PORT))