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



>目标

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

环境

  • 设备/操作系统:Jetson nano with Ubuntu 18.04.3 LTS(仿生海狸(
  • JavaC版本:javac 11.0.4
  • Java版本:
    • openjdk版本"11.0.4" 2019-07-16
    • OpenJDK 运行时环境(build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3(
    • OpenJDK 64 位服务器 VM(内部版本 11.0.4+11-post-Ubuntu-1ubuntu218.04.3,混合模式(

问题

我可以将数据从 Python 测试服务器(请参阅下面的代码(发送到 Python 测试客户端。但是,如果我尝试将数据从 Java 测试服务器发送到 Python 测试客户端,似乎没有任何结果。Java 服务器不会引发异常。

在 Python 中测试客户端(工作(

import socket
UDP_IP = "localhost"
UDP_PORT = 9999
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
print("listening...")
while True:
data, addr = sock.recvfrom(1024)
print("received message from: ", addr)
print("payload: ", data)

Python 中的测试服务器(工作(

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto("Hello World", ("localhost", 9999))

Java 中的测试服务器(不工作或无法访问 python 客户端(

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

返回计算机接口之一的地址。

溶液

正如@Gomiero建议的那样,使用任一

InetAddress address = InetAddress.getByName("127.0.0.1");
// or
InetAddress address = InetAddress.getByName("localhost");

解决了这个问题,因为在这种情况下,客户端绑定到127.0.0.1并且不接受来自任何其他 IP 地址的数据包。

注意

正如@user207421建议的那样,在大多数情况下,问题的正确解决方案是将客户端绑定到如下所示的0.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.1now,并正确理解它的作用,因为我只需要来自本地计算机的数据。

最新更新