在python中一个套接字发送多个文件



我正在尝试通过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次发送。

我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新