gpt4 book ai didi

python - 如何使用套接字将文件从flutter应用程序发送到python服务器

转载 作者:行者123 更新时间:2023-12-03 04:46:10 27 4
gpt4 key购买 nike

我正在尝试将文件从 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 项目。
请帮忙。
this is how its happening at the server

最佳答案

我不知道 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()

因此,让我们首先看一下您手头的问题,但是一旦解决了,您就可以阅读我的其余答案。

顺便说一句,您的协议(protocol)有点危险。

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

不是这种情况。

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

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

关于python - 如何使用套接字将文件从flutter应用程序发送到python服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62257279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com