【问题标题】:Sending Java Packets to Python Server?向 Python 服务器发送 Java 数据包?
【发布时间】:2011-04-14 16:15:11
【问题描述】:

我刚刚开始学习发送 UDP 数据包,但遇到了问题。我编写了一个易于相互通信的 Java 客户端和服务器,并且我已经完成了 Python 客户端/服务器组合,但我不确定如何从 Java 发送 UDP 数据包并在 Python 中接收它。这是我为 Java 客户端准备的:

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 服务器将“Hi”发送回 Java 客户端,并让客户端打印字符串。对我来说发生的是客户端发送数据包,而服务器在sock.recvfrom(256) 处等待并且永远不会收到数据包(或者它看起来就是这样)。

有什么想法吗?我猜 Java 和 Python 处理数据包的方式有些不同,但我不确定。

编辑:为了澄清起见,端口号是通过这两个应用程序的命令行参数传入的。

【问题讨论】:

  • gethostname() 返回什么(在交互式解释器上尝试)。您可能正在绑定外部接口,而不是 localhost == 127.1,因为您似乎打算在上述 sn-ps 中执行此操作。
  • 它返回我机器的名称。

标签: java python client udp


【解决方案1】:

问题一定出在你的代码里面,他们应该可以交流:this 是用 java 编写客户端服务器对的一个很好的例子。

【讨论】:

  • 谢谢,但我已经按照该教程进行操作了。我按照它编写了一个客户端服务器对,它工作正常。但是,一旦我开始使用 Python 服务器,它就不再工作了。
  • 也许尝试指定它正在侦听的端口会有所帮助,您确定您的客户端和服务器正在侦听同一端口吗?
  • 另外,让客户端和服务器的代码分别运行在各自独立的线程守护进程中可能会很有用(这样当你的程序完成时它们就会死掉)。此外,您的服务器看起来不像在循环中运行(即 for(;;)),这可能是个问题。当你运行它时,你的服务器会打印出任何东西吗?
  • 是的,它会打印出“正在接收...” 我只想让它接收数据包,向客户端发送数据包,然后退出。所以在这种情况下,不需要循环。我确定他们正在侦听同一个端口,因为我通过命令行参数传递了端口号。
  • 尝试从每个客户端和服务器打印出端口和主机名,以确保它们尝试连接到相同的东西。问题出在协议的实现上似乎没有任何意义。
【解决方案2】:

首先,我使用的是 Ubuntu 10.10。

我进入 /etc/hosts,看起来 127.0.0.1 分配给了 localhost.localdomain,而 127.0.1.1 分配给了我的机器名。因此,Python 使用的是本地主机地址,而 Java 使用的是我的机器名称地址。我将 localhost 更改为我的机器名称,现在一切正常。

感谢大家的帮助!

【讨论】:

    【解决方案3】:

    在 Java 中,我看到了您创建数据包的位置,但我没有看到您在发送之前使用 setData 将任何数据实际放入数据包中。

    【讨论】:

    • 刚刚尝试设置数据,并没有修复它。但是,我认为无论如何我都不必在客户端数据包中设置数据,因为它更多的是请求而不是实际发送信息。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多