use*_*334 6 python ftp resume timeout
我从文件传输过程中经常超时的片状FTP服务器下载文件,我想知道是否有办法重新连接并恢复下载.我正在使用python的ftplib.这是我正在使用的代码:
#! /usr/bin/python
import ftplib
import os
import socket
import sys
#--------------------------------#
# Define parameters for ftp site #
#--------------------------------#
site = 'a.really.unstable.server'
user = 'anonymous'
password = 'someperson@somewhere.edu'
root_ftp_dir = '/directory1/'
root_local_dir = '/directory2/'
#---------------------------------------------------------------
# Tuple of order numbers to download. Each web request generates
# an order numbers
#---------------------------------------------------------------
order_num = ('1','2','3','4')
#----------------------------------------------------------------#
# Loop through each order. Connect to server on each loop. There #
# might be a time out for the connection therefore reconnect for #
# every new ordernumber #
#----------------------------------------------------------------#
# First change local directory
os.chdir(root_local_dir)
# Begin loop through
for order in order_num:
print 'Begin Proccessing order number %s' %order
# Connect to FTP site
try:
ftp = ftplib.FTP( host=site, timeout=1200 )
except (socket.error, socket.gaierror), e:
print 'ERROR: Unable to reach "%s"' %site
sys.exit()
# Login
try:
ftp.login(user,password)
except ftplib.error_perm:
print 'ERROR: Unable to login'
ftp.quit()
sys.exit()
# Change remote directory to location of order
try:
ftp.cwd(root_ftp_dir+order)
except ftplib.error_perm:
print 'Unable to CD to "%s"' %(root_ftp_dir+order)
sys.exit()
# Get a list of files
try:
filelist = ftp.nlst()
except ftplib.error_perm:
print 'Unable to get file list from "%s"' %order
sys.exit()
#---------------------------------#
# Loop through files and download #
#---------------------------------#
for each_file in filelist:
file_local = open(each_file,'wb')
try:
ftp.retrbinary('RETR %s' %each_file, file_local.write)
file_local.close()
except ftplib.error_perm:
print 'ERROR: cannot read file "%s"' %each_file
os.unlink(each_file)
ftp.quit()
print 'Finished Proccessing order number %s' %order
sys.exit()
Run Code Online (Sandbox Code Playgroud)
我得到的错误:socket.error:[Errno 110]连接超时
任何帮助是极大的赞赏.
仅使用标准设施(参见RFC959 )通过 FTP 恢复下载需要使用块传输模式(第 3.4.2 节),可以使用MODE B命令进行设置。尽管此功能在技术上是符合规范所必需的,但我不确定所有 FTP 服务器软件都实现了它。
在块传输模式中,与流传输模式相反,服务器以块的形式发送文件,每个块都有一个标记。该标记可以重新提交到服务器以重新启动失败的传输(第 3.5 节)。
规范说:
[...] 提供重新启动程序以保护用户免受严重系统故障(包括主机、FTP 进程或底层网络故障)的影响。
然而,据我所知,该规范没有定义标记所需的寿命。它只说了以下几点:
标记信息仅对发送者有意义,但必须由控制连接的默认或协商语言(ASCII 或 EBCDIC)中的可打印字符组成。标记可以表示位计数、记录计数或系统可以用来识别数据检查点的任何其他信息。数据接收方如果执行了重启过程,则在接收系统中标记该标记的相应位置,并将该信息返回给用户。
可以安全地假设实现此功能的服务器将提供在 FTP 会话之间有效的标记,但您的情况可能会有所不同。
| 归档时间: |
|
| 查看次数: |
3909 次 |
| 最近记录: |