2

我在 Python 中有一个发送数据的客户端(前面是数据长度消息):

s = socket.socket()
s.connect((host, port))
data = 'hello world'
s.sendall('%16s' % len(data)) #send data length
s.sendall(data) #send data
s.close()

以及一个接收数据的 Java 服务器。服务器在读取数据之前使用DataInputStream.readInt()读取数据长度。但是,我似乎得到了 readInt() 返回的非常大的数字。问题是什么?

4

2 回答 2

7

Java 需要整数的二进制表示。您可以使用struct模块生成二进制表示。

在您的情况下,这将是:

import struct
s.sendall(struct.pack('i', len(data)))

还要确保使用正确的字节顺序。Java 可能需要网络字节顺序。

于 2012-04-19T13:19:02.150 回答
2

正如@mensi 所说,没有任何其他处理,Java 期望接收数据的二进制表示,这与 Python 发送的不同。此类问题的常见解决方案是将数据序列化——即将数据转换为更适合网络传输的格式,并在接收端重构数据。

Python 和 Java 都支持的常见序列化格式是JSON。最新版本的 Python 将该json模块作为标准库的一部分。

于 2012-04-19T13:25:04.357 回答