retrbinary期间线程化的“NOOP”命令

2024-06-18 11:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个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'

Tags: 文件path代码脚本ftpbytethreadstart