簡體   English   中英

如何在 dart 中接收和解析來自 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:]

現在我對dartflutter 有點陌生 所以我嘗試通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM