Python套接字客户端连接Java套接字服务器

0 投票
3 回答
3088 浏览
提问于 2025-04-15 15:35

我有一个Java的socket服务器,它需要从某个端口接收正好 n 个字节的数据。我想写一个Python客户端,向这个Java服务器发送字节数据。

因为Python没有像Java那样的基本数据类型,我不太确定怎么才能发送正好 n 个字节。有没有什么建议呢?

更多细节:

我有一个Java的DatagramSocket,它需要接收 n 个字节:

DatagramPacket dp = new DatagramPacket(new byte[n], n);

3 个回答

0

感谢大家的回答,我终于找到了我想要的东西。我想要的是使用struct.unpack和struct.pack这两个功能,来把Python中的浮点数1.2345转换成C语言中的双精度浮点数的字符串表示。

也就是说:

>>> struct.pack('d', 1.2345)
'\x8d\x97n\x12\x83\xc0\xf3?'
>>> struct.unpack('d', struct.pack('d', 1.2345))[0]
1.2344999999999999

谢谢!

1

如果你在使用数据报套接字(比如通过IP的UDP协议),那么Socket API保证只要你的数据大小n小于最大负载大小,你的数据就会在一个数据包中发送出去。所以只需要调用socket.send就可以了。

而对于套接字,发送数据最简单的方法是使用socket.sendall这个方法,因为对于流套接字,send并不能保证所有数据都会被发送出去(你可能需要多次调用send才能把所有数据都发出去)。下面是一个例子:

>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 12345))
>>> data = 'your data of length n'
>>> s.sendall(data)

正如@Alex提到的,Python中并没有什么“原始数据类型”的概念。这只是Socket API的问题。

1

somesocket.send 这个函数需要一个字节串作为参数 s,你只需要确保 len(s) == n,这样你就能发送正好 n 个字节。那“原始数据”跟这个有什么关系呢?

如果你想把各种数据转换成字节串(或者反过来),可以看看 Python 标准库里的 struct 模块(对于简单类型的同类数组,比如浮点数,array 模块通常会更好用)。

撰写回答