线程' NOOP'在retrbinary期间的命令

时间:2011-04-04 23:52:53

标签: python multithreading controls ftplib keep-alive

我编写了一个FTP脚本,不幸的是它必须处理防火墙后面的服务器。无论我在防火墙的任何一侧设置何种超时设置,ISP都会很早地切断我的控制连接。我终于有了两个选择。 1)在retrbinary命令中分叉代码,以便在下载完成时每n秒发送一个“NOOP”,或者2)在retrbinary命令中分叉代码,以便脚本将本地文件的大小与远程文件的大小进行比较。一旦大小不同,它会尝试下载下一个文件。

我在下面添加了一些代码,这些代码表明了我每隔n秒发送一次“NOOP”的尝试。问题是,当脚本进入isAlive while循环并且发送执行ftp.sendcmd('NOOP')时,事情会挂起并且while循环会锁定。该文件仍在TCP端口63xxx上下载,但我在端口21上的控制连接已被锁定。

至于在使用线程下载期间检查文件大小,由于文件大小未达到完整值而失败,因为文件大小并未在下载结束时保持相同的值。

现在的主要问题是在大量下载过程中保持我的控制连接活着,我的任何可能的手段。如果由于某种原因导致控制连接被终止,我的脚本需要有一个很好的方法来知道文件传输何时完成。没有控制连接,它无法从服务器响应中知道。

提前致谢。

def FTP_RETR(ftp_transfer_path, f, start_byte):
     ftp.retrbinary('RETR %s' % ftp_transfer_path, f.write, rest = '%s' % start_byte)
     f.close()

ftp = FTP()
ftp.connect(FTP_server, FTP_port)
ftp.login(FTP_username, FTP_password)
ftp.cwd(home_dir)

ftp_transfer_path = 'file_to_get.dat'
start_byte = 0

filename = 'C:\\myfile.txt'
f = open('C:\\myfile.txt', 'wb')

ftp.sendcmd('TYPE I')


transfer_thread = threading.Thread(target = FTP_RETR, args = (ftp_transfer_path, f, start_byte))
transfer_thread.start()

while transfer_thread.isAlive():
    time.sleep(5)
    ftp.sendcmd('NOOP')

print 'Finished'

0 个答案:

没有答案