向Python服务器发送Java数据包?
我刚刚开始学习发送UDP数据包,我遇到了一个问题。我编写了一个Java客户机和服务器,它们可以轻松地相互通信,我还编写了一个Python客户机/服务器组合,但我不确定如何从Java发送UDP数据包并在Python中接收它。以下是我为Java客户机准备的:向Python服务器发送Java数据包?,java,python,client,udp,Java,Python,Client,Udp,我刚刚开始学习发送UDP数据包,我遇到了一个问题。我编写了一个Java客户机和服务器,它们可以轻松地相互通信,我还编写了一个Python客户机/服务器组合,但我不确定如何从Java发送UDP数据包并在Python中接收它。以下是我为Java客户机准备的: import java.io.*; import java.net.*; public class testclient { public static void main(String[] args) throws IOExcept
import java.io.*;
import java.net.*;
public class testclient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] buf = new byte[256];
InetAddress address = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, Integer.parseInt(args[0]));
System.out.println("Sending...");
socket.send(packet);
System.out.println("Receiving...");
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println(received);
System.out.println("Done!");
socket.close();
}
}
和Python服务器:
from sys import *
from socket import *
host = gethostname()
port = int(argv[1])
address = (host, port)
print "Binding..."
sock = socket(AF_INET, SOCK_DGRAM)
sock.bind(address)
print "Receiving..."
data, client = sock.recvfrom(256)
print "Sending to", client
sock.sendto("Hi", client)
print "Closing..."
sock.close()
print "Done!"
这里我要做的就是从Java客户机向Python服务器发送一个请求,然后让Python服务器向Java客户机发送“Hi”,并让客户机打印字符串。对我来说,客户端发送数据包,而服务器在sock.recvfrom(256)
处等待,但从未收到数据包(或者说它看起来就是这样)
有什么想法吗?我猜Java和Python处理数据包的方式有些不同,但我不确定
编辑:只是为了澄清一下,端口号是通过这两个应用程序的命令行参数传入的。在Java中,我看到了您在哪里创建数据包,但我没有看到您在发送数据包之前实际将任何数据放入数据包中。问题必须在您的代码中,它们应该能够通信:
是一个用java编写客户机-服务器对的好例子 首先,我使用的是Ubuntu 10.10 我进入/etc/hosts,看起来127.0.0.1被分配给了localhost.localdomain,而127.0.1.1被分配给了我的机器名。因此,Python使用的是localhost地址,而Java使用的是我的机器名地址。我把localhost改成了我的机器名,现在一切都正常了
谢谢大家的帮助 谢谢,但我已经听过那个教程了。我根据这一点编写了一个客户机-服务器对,它工作得很好。但是,一旦我开始使用Python服务器,它就不再工作了。也许尝试指定它正在侦听的端口会有所帮助,您确定您的客户端和服务器正在侦听同一个端口吗?另外,让客户端和服务器的代码在各自独立的线程守护进程中运行可能会很有用(所以当你的程序完成时,它们就消失了)。此外,你的服务器看起来并不是在循环中运行(例如,for(;;)),这可能是个问题。你的服务器在运行时打印出了什么吗?是的,打印出“接收…”我只想让它接收数据包,向客户端发送数据包,然后退出。因此,在这种情况下,不需要循环。我确信它们正在侦听同一个端口,因为我通过命令行参数传入端口号。尝试打印客户端和服务器上的每个端口和主机名,以确保它们正在尝试连接同样的事情。问题似乎不在于协议的实现。只是尝试设置数据,没有解决它。但是,我想我无论如何都不必在客户端数据包中设置数据,因为它更多的是一个请求,而不是实际发送信息。
gethostname()
返回什么(在交互式解释器上尝试)。有可能您正在绑定外部接口,而不是像您在上述代码片段中所想的那样绑定到localhost==127.1
。它返回我的机器的名称。