![](/img/trans.png)
[英]How to recieve data from a one socket and send it to another socket in python?
[英]How to recieve and parse data coming from a Python socket server in dart?
我有一個在 Python 中運行的套接字服務器,它通過套接字發送一個字節 stream,其中前 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和flutter 有點陌生。 所以我嘗試通過 dart 的 sockets(我不確定它是如何實現的)接收數據包,如下所示:
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 = '$error\n\n$stackTrace';
});
});
現在首先,我發現 Dart 的 sockets 以 Uint8List 格式顯示字節,所以我嘗試執行我在 python 客戶端腳本中所做的操作,但值不匹配。
len(pickle_dump)
的值為921765但 dart 代碼(如代碼片段中所述)打印-6552722064661282816 。 現在我相信 dart 的類型識別是造成問題的原因,因為我打包的是服務器腳本中的'Q'
(使用結構),它代表“Unsigned long long” ,但是在 dart 中,我將其解析為“Unsigned”詮釋' 。 我該如何解決這個問題? 此外,簡短的討論到底是怎么回事會有很大幫助。
正如pskink所提到的,這里的問題是由於 Dart 的getUint64()
的默認 Endian 與 Python 的struct庫(它使用 'little' endianness 來打包數據)的不同。 因此,只需將getUint64(0)
行重寫為getUint64(0, Endian.little)
解決這種情況下的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.