目标
我试图通过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");
}
}
}发布于 2019-11-23 13:10:29
问题
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,并正确理解它的作用,因为我只需要本地机器上的数据。
https://stackoverflow.com/questions/59003229
复制相似问题