我有一个线程化的 FTP 脚本。当数据套接字接收数据时,线程循环将 NOOP 命令发送到控制套接字,以在大传输期间保持控制连接处于活动状态。
我被阻止使用该FTP.retrbinary()
命令,因为如果我想保持控制连接处于活动状态,我必须将数据和控制套接字分开,而这retrbinary
不起作用。
下面的代码:
def downloadFile(filename, folder):
myhost = 'HOST'
myuser = 'USER'
passw = 'PASS'
#login
ftp = FTP(myhost,myuser,passw)
ftp.set_debuglevel(2)
ftp.voidcmd('TYPE I')
sock = ftp.transfercmd('RETR ' + filename)
def background():
f = open(folder + filename, 'wb')
while True:
block = sock.recv(1024*1024)
if not block:
break
f.write(block)
sock.close()
t = threading.Thread(target=background)
t.start()
while t.is_alive():
t.join(120)
ftp.voidcmd('NOOP')
ftp.quit();
我的问题:FTP.transfercmd("RETR " + filename)
默认为 ASCII 传输和我传输视频,所以它必须是二进制的(因此ftp.voidcmd('TYPE I)
调用强制二进制模式)。
如果我不调用NOOPftp.voidcmd('TYPE I)
命令发送成功,输出如下:
*cmd* 'NOOP'
*put* 'NOOP\r\n'
*get* '200 NOOP: data transfer in progress\n'
*resp* '200 NOOP: data transfer in progress'
*cmd* 'NOOP'
*put* 'NOOP\r\n'
*get* '200 NOOP: data transfer in progress\n'
*resp* '200 NOOP: data transfer in progress'
*cmd* 'NOOP'
*put* 'NOOP\r\n'
*get* '200 NOOP: data transfer in progress\n'
*resp* '200 NOOP: data transfer in progress'
等等,但文件是 ASCII 格式,因此已损坏。如果我调用, NOOPftp.voidcmd('TYPE I)
命令只发送一次,并且控制套接字在传输完成之前不会响应。如果文件很大,则控制套接字会超时,就好像从未发送过 NOOP...
很奇怪,但我相信它很简单。似乎它transfercmd()
没有像预期的那样拆分控制和数据套接字......因此 ftp var 没有与数据流分离......或其他东西。奇怪的。
提前感谢您提供的任何建议。