有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

进球

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

环境

  • 设备/OS:Jetson nano和Ubuntu18.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位服务器虚拟机(构建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");
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    问题

    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上,并正确理解它的作用,因为我只需要来自本地机器的数据