Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中一个套接字发送多个文件_Python_File_Sockets - Fatal编程技术网

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

在python中一个套接字发送多个文件,python,file,sockets,Python,File,Sockets,我正在尝试用python中的套接字发送文件(图像和文本)。我不想每次都创建一个新连接,因为代码在短时间内编写了大量文件(>100),所以我不想在它们等待关闭时建立那么多连接。因此,在发送文件的每个块之前,我首先发送块的长度。当我运行它时,它在length=int(s.recv(4))上给我一个ValueError,显示文件中的一个字符串,并表示它无法转换为int。下面是我的代码中发送和接收一个文件的部分: 发送: #Connect s and open file f s.setblocking(

我正在尝试用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
#连接s并打开文件f
s、 立根锁定(1)
buf=4096
尽管如此:
msg=f.read(buf)
长度=str(len(msg))
如果len(长度)<4:length=“0”*(4-len(长度))+长度
s、 sendall(长度)
如果长度=“0000”:中断
s、 sendall(msg)
如果len(msg)!=buf:休息
接收:

#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
#连接s并打开文件f
尽管如此:
长度=整数(s.recv(4))
如果长度==0:中断
f、 写入(s.recv(长度))
如果长度

在Windows8上运行

如果您发送的是大文件(取决于您的路由器),路由器可能会将数据包拆分为较短的数据包,从而导致您意外地尝试获取数据块的长度,但仍然无法获取之前的整个文件。如果不继续使用s.recv(length-len(what_i_获得的数据到目前为止))请求数据,那么应该使用while循环确保获得了整个数据长度

例如,当我通过局域网向自己发送几MB的图片时,路由器将数据包剪切到25KB左右,因此我不得不多次使用recv,尽管我只使用了一次发送


我希望这能有所帮助。

使用
socket.htonl
socket.ntohl
并将其作为二进制文件发送。您能详细介绍一下吗?为什么不能使用ftp或sftp?