将Java数据包发送到Python服务器?

0 投票
3 回答
2203 浏览
提问于 2025-04-16 15:45

我刚开始学习如何发送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”,最后客户端打印这个字符串。但是我遇到的问题是,客户端发送了数据包,而服务器在sock.recvfrom(256)这行代码处一直在等待,却没有收到数据包(看起来是这样)。

有没有什么想法?我猜这可能是Java和Python处理数据包的方式有些不同,但我不太确定。

补充说明一下,端口号是通过命令行参数传递给这两个应用程序的。

3 个回答

0

在Java中,我看到你创建了一个数据包,但我没有看到你在发送之前,实际上用 setData 方法往这个数据包里放任何数据。

1

问题可能出在你的代码里,它们应该能够互相通信:这个链接是一个很好的例子,展示了如何用Java编写客户端和服务器的配对。

1

首先,我的系统是Ubuntu 10.10。

我查看了/etc/hosts文件,发现127.0.0.1这个地址被分配给了localhost.localdomain,而127.0.1.1则被分配给了我的机器名称。所以,Python程序使用的是localhost这个地址,而Java程序使用的是我的机器名称的地址。我把localhost改成了我的机器名称,现在一切都正常了。

谢谢大家的帮助!

撰写回答