首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将UDP从Java发送到Python不起作用

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

Stack Overflow用户
提问于 2019-11-22 23:50:28
回答 1查看 260关注 0票数 3

目标

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

环境

  • Device/OS: Jetson与Ubuntu18.04.3 LTS (仿生Beaver)
  • JavaC版本: javac 11.0.4
  • Java版本:
    • openjdk版本"11.0.4“2019-07-16
    • OpenJDK运行时环境(构建11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
    • OpenJDK 64位服务器VM ) (build 11.0.4+11-postUbuntu218.04.3,混合mode)

问题

我可以从Python测试服务器(参见下面的代码)向Python测试客户端发送数据。但是,如果我试图从Java测试服务器向Python测试客户端发送数据,似乎什么都没有。Java服务器不会抛出异常。

用Python测试客户端(工作)

代码语言:javascript
复制
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中的测试服务器(工作)

代码语言:javascript
复制
import socket

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

Java测试服务器(无法工作或无法到达python客户端)

代码语言:javascript
复制
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");
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-23 13:10:29

问题

代码语言:javascript
复制
InetAddress address = InetAddress.getLocalHost();

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

解决方案

如@Gomiero所建议,使用以下任何一种

代码语言:javascript
复制
InetAddress address = InetAddress.getByName("127.0.0.1");
// or
InetAddress address = InetAddress.getByName("localhost");

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

备注

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

代码语言:javascript
复制
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,并正确理解它的作用,因为我只需要本地机器上的数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59003229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档