java - 将 UDP 从 Java 发送到 Python 不起作用
问题描述
目标
我正在尝试通过 UDP 从 Java 服务器向同一台机器上的 Python 客户端发送数据。
环境
- 设备/操作系统:带有 Ubuntu 18.04.3 LTS(仿生海狸)的 Jetson nano
- JavaC 版本: javac 11.0.4
- 爪哇版:
- 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.1
但是,我最终决定在正确理解其作用的情况下将客户端绑定到现在,因为我只想要来自本地计算机的数据。
推荐阅读
- keycloak - Keycloak 仅在首次登录时获取 Google 刷新令牌
- c# - 如何将自定义异常过滤器的异常(实现 IExceptionFilter)记录到文件中
- python - 当索引在范围内时如何修复索引超出范围
- installation - 在 cygwin shell 中运行 ./autogen.sh 时构建 LibreOffice 时出错
- r - 更改R ggplot中条形之间的间隙
- python - 如何在python中将参数传递给POST请求
- html - 图片回退默认为 png 而不是 webp
- rubygems - 无法安装可可豆荚
- c# - WinForms 滚动条,禁用超出范围的滚动。应该是手动的?
- dask - 当数据不适合内存时,将 dask 数据帧存储到镶木地板