gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:02:01 25 4
gpt4 key购买 nike

目标

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

环境

  • 设备/操作系统:Jetson nano 和 Ubuntu 18.04.3 LTS(Bionic Beaver)
  • 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 位服务器虚拟机(build 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();

返回机器接口(interface)之一的地址。

解决方案

正如@Gomiero 所建议的,使用其中之一

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

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

注意事项

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

UDP_IP = "0.0.0.0"
UDP_PORT = 9999
sock.bind((UDP_IP, UDP_PORT))

将客户端绑定(bind)到 0.0.0.0 解决了在服务器端使用 InetAddress.getLocalHost() 的问题,因为它使客户端接受数据到其任何IP 地址。

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

关于java - 将 UDP 从 Java 发送到 Python 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59003229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com