将UDP从Java发送到Python不起作用 目标
我试图通过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.
- 设备/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,混合模式)
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))