【问题标题】:how to send file from flutter app to python server using socket如何使用套接字将文件从flutter应用程序发送到python服务器
【发布时间】:2020-06-08 07:44:35
【问题描述】:

我正在尝试将文件从颤振应用程序发送到 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(""));

这是来自我的颤振项目。 请帮忙。 this is how its happening at the server

【问题讨论】:

  • 我猜data = sock.recv(1024)gedit server.py 应该是data = sock.recv(1024),对吧?
  • 只是为了确定。你使用的是 python3 而不是 python2,对吧?

标签: python sockets flutter dart tcp


【解决方案1】:

我不知道颤振,但如果可以的话,我会为套接字添加一个 explicit 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()

所以让我们先看看你手头的问题,但是一旦它解决了,你就可以阅读我的其余答案。

顺便说一句,你的协议有点危险。

据我所知,您无法保证字节以与发送它们相同的块大小到达。所以网络协议应该写成这样,即使你收到一个字节的数据字节,你也会知道文件名在哪里结束以及文件大小在哪里结束。

事实并非如此。

想象一下文件名“test1”,文件大小“4”,文件内容“5ABC” 这导致 “test145ABC” 是文件名“test”和文件大小“145”还是文件名“test14”和文件大小“5”。不可能知道。

一种选择是发送文件名、终止字符、文件大小、终止字符,然后是文件内容,或者使用二进制协议,首先发送两个字节表示文件名的长度,然后文件名,然后是表示文件大小的 4 个字节,然后是文件内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2020-06-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多