我正在尝试通过python中的套接字发送文件(图像和文本)。我不想每次都创建一个新的连接,因为代码在短时间内写入了很多文件(>100),所以我不想在它们等待关闭时建立那么多连接。因此,在发送文件的每个块之前,我首先发送块的长度。当我运行它时,它会在length = int(s.recv(4))
上给我一个ValueError,显示文件中的一个字符串,并表示它无法转换为int。以下是我的代码中发送和接收一个文件的部分:发送:
#Connect s and open file f
s.setblocking(1)
buf = 4096
while True:
msg = f.read(buf)
length = str(len(msg))
if len(length) < 4: length = "0"*(4-len(length)) + length
s.sendall(length)
if length == "0000": break
s.sendall(msg)
if len(msg) != buf: break
接收:
#Connect s and open file f
while True:
length = int(s.recv(4))
if length == 0: break
f.write(s.recv(length))
if length < buf: break
在Windows 8上运行。
如果您发送的是大文件(取决于您的路由器),路由器可能会将数据包拆分为较短的数据包,导致您意外地试图获得块的长度,但仍然无法获得整个早期文件。如果没有继续使用s.recv(length-len(what_i_got_so_far))请求数据,您应该确保使用while循环获得整个长度的数据。
例如,当我通过局域网向自己发送一张几MB的图片时,路由器会将数据包剪切到25 KB左右,所以我不得不多次使用recv,尽管我只使用了1次发送。
我希望这能有所帮助。