如何接收和解析来自Python套接字服务器的数据?



我有一个用Python运行的套接字服务器,它通过套接字发送字节流,其中前8个字节包含剩余消息体的大小。代码看起来像这样:

data_to_send = struct.pack("Q", len(pickle_dump))+pickle_dump

client_socket.sendall(data_to_send)

用Python编写的客户端端点如下所示:

data = b''
PAYLOAD_SIZE = struct.calcsize('Q')
while len(data) < PAYLOAD_SIZE:
packet = client_socket.recv(1024)
if not packet:
break
data += packet
print(len(data), PAYLOAD_SIZE)
packed_msg_size = struct.unpack('Q', data[:PAYLOAD_SIZE])[0]
data = data[PAYLOAD_SIZE:]
while len(data) < packed_msg_size:
data += client_socket.recv(1024)
print(type(data))
frame_data = data[:packed_msg_size]
data = data[packed_msg_size:]

现在我对dart有点陌生了扑动。所以我尝试通过dart的套接字接收数据包(我不确定它是如何实现的),像这样:

Socket.connect("10.0.2.2", 7878).then((socket) {
SOCKET = socket;
setState(() {
print('Connected to: '
'${socket.remoteAddress.address}:${socket.remotePort}');
log = '${socket.remoteAddress.address}:${socket.remotePort}';
});
var FULL_CLUSTER = ByteData(0);

// MAIN STUFF STARTS HERE
socket.listen((data) {
Uint8List size_bytesdata = data.sublist(0, 8);
print(size_bytesdata.buffer.asByteData().getUint64(0)); // Prints -6552722064661282816
print(size_bytesdata);
socket.destroy();
});
//
}).onError((error, stackTrace) {
setState(() {
log = '$errornn$stackTrace';
});
});

现在首先,我发现Dart的套接字以Uint8List格式显示字节,所以我尝试做我在python客户端脚本中所做的事情,但值不匹配。

len(pickle_dump)的值921765,但是dart代码(如代码片段中所述)打印的是-6552722064661282816。现在我相信dart的类型识别是导致问题的原因,因为我在服务器脚本中打包了'Q'(使用struct),它代表'Unsigned long',但是,在dart中,我将其解析为'Unsigned int'。如何解决这个问题?此外,简短地讨论一下到底发生了什么会有很大帮助。

正如pskink所提到的,这里的问题是因为Dart的getUint64()的默认端位数与Python的struct的端位数不同而引起的。库(它使用'little'端序来打包数据)。因此,只需将getUint64(0)重写为getUint64(0, Endian.little)就可以解决本例中的问题。

最新更新