我试图通过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上运行。
答案 0 :(得分:0)
如果您要发送大文件(取决于您的路由器),路由器可能会将数据包拆分为较短的文件,导致您意外地尝试获取块的长度,同时仍然无法获取整个早期文件。您应该确保使用while循环获得整个数据长度,如果没有继续使用s.recv请求数据(length - len(what_i_got_so_far))。
例如,当我通过局域网向自己发送几张MB图片时,路由器将数据包切换到大约25 KB,因此我必须多次使用recv,尽管我只使用了1次发送。
我希望这会有所帮助。