首页 > 解决方案 > 将 UDP 从 Java 发送到 Python 不起作用

问题描述

目标

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

环境

问题

我可以将数据从 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");
        }
    }
}

标签: javapythonsocketsudplocalhost

解决方案


问题

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但是,我最终决定在正确理解其作用的情况下将客户端绑定到现在,因为我只想要来自本地计算机的数据。


推荐阅读