簡體   English   中英

如何使用套接字將文件從 flutter 應用程序發送到 python 服務器

[英]how to send file from flutter app to python server using socket

我正在嘗試將文件從 flutter 應用程序發送到 python 服務器。 但由於某種原因,我無法做到。 在 98.67% 時停止。 如果有人能幫我解決這個問題,那就太好了。

        filename = sock.recv(1024)

        if filename != "":
            filesize = sock.recv(1024)


            print(filesize)
            f = open("client.jpg",'wb')
            data = sock.recv(1024)gedit server.py

            totalRecv = len(data)
            f.write(data)
            while data != '':
                data = sock.recv(1024);
                totalRecv += len(data)  
                f.write(data)
                print("{0:.2f}".format((totalRecv/float(filesize))*100)+"% done")
            print("download complete")
            f.close()
        sock.close()

以上是我的服務器代碼。

File file = await FilePicker.getFile();
      socket.add(utf8.encode("RECV"));
      //socket.add(utf8.encode(file.path));
      print(file.path);
      //print(file.lengthSync());
      //socket.add(utf8.encode(file.lengthSync().toString()));
      var bytes = file.readAsBytesSync();
      socket.add(bytes);
      socket.add(utf8.encode(""));

這是來自我的 flutter 項目。 請幫忙。 這就是它在服務器上發生的方式

我不知道 flutter,但如果可以的話,我會為套接字添加一個明確close命令。 可能是最后一個字節沒有被清除。

如果不起作用,請更改代碼以進行調試。

# you receive bytes.
# but you want a string, so you have to decode
filename_bytes = sock.recv(1024) 
filename = filename_bytes.decode("utf-8") 

print("I received %d bytes and my filename is %r" 
      % (len(filename_bytes), filename))

    if filename != "":
        filesize = sock.recv(1024)
        print("I got %d bytes and file size is %r"
              % len(filesize), totalRecv)
        filesize = int(filesize)
        f = open("client.jpg",'wb')
        data = sock.recv(1024)

        totalRecv = len(data)
        f.write(data)
        while data != '':
            data = sock.recv(1024)
            totalRecv += len(data)  
            f.write(data)
            print("{0:.2f}% done {1} bytes".format(
                (totalRecv/filesize)*100, filesize))
        print("download complete")
        f.close()
sock.close()

所以讓我們先看看你手頭的問題,但一旦它解決了,你可能會閱讀我的回答中的 rest。

順便說一句,您的協議有點危險。

據我所知,您無法保證字節以與發送它們相同的塊大小到達。 所以網絡協議應該寫成這樣,即使你收到每個字節的數據字節,你也會知道文件名在哪里結束以及文件大小在哪里結束。

不是這種情況。

想象一下文件名“test1”,文件大小“4”,文件內容“5ABC” 這導致“test145ABC”是文件名“test”和文件大小“145”還是文件名“test14”和文件大小“5”。 不可能知道。

一種選擇是發送文件名、終止字符、文件大小、終止字符,然后是文件內容,或者使用二進制協議,首先發送兩個字節,指示文件名的長度,然后是文件名, 然后是 4 個字節,表示文件大小,然后是文件內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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