我正在编写一个脚本,该脚本连接“服务器”计算机中的多个“客户端”计算机,然后使用这些客户端处理多个文件,使用 FTP(pyftplib 和 pyftpdlib)传输文件和结果。
该脚本通过在服务器上创建 3 个文件夹来工作:文件、处理和结果。客户端然后通过 FTP 连接到服务器,访问“文件”文件夹,获取文件进行处理,然后在处理时将其传输到“处理”文件夹。然后,当它完成处理时,客户端从处理文件夹中删除文件并将结果复制到“结果”文件夹。
这在服务器和客户端都正常工作。我遇到的问题是,如果其中一个客户端在没有产生错误的情况下中途断开连接(PC 已断开连接,断电),服务器将威胁这一点,就好像客户端仍在处理文件一样,并且文件将保留在“处理”文件夹。我想要的是一个错误检查功能,当这种情况发生时,“处理”文件夹中的文件将返回到“文件”文件夹。
这是服务器 FTP 代码
def main():
authorizer = DummyAuthorizer()
authorizer.add_user('client', 'password', '.', perm='elradfmwM')
authorizer.add_anonymous(os.getcwd())
handler = FTPHandler
handler.authorizer = authorizer
handler.banner = "FTP Server."
address = ('', port)
server = FTPServer(address, handler)
server.max_cons = 256
server.max_cons_per_ip = 50
server.serve_forever()
if __name__ == '__main__':
main()
这是客户端 FTP 代码:
while True:
ftp = ftplib.FTP()
ftp.connect(arguments.host_ip, arguments.host_port)
ftp.login("client", "password")
print ftp.getwelcome()
ftp.retrlines('LIST')
ftp.retrbinary('RETR Output.txt', open('Output.txt', 'wb').write)
ftp.retrbinary('RETR dicionario.json', open('dicionario.json', 'wb').write)
with open('dicionario.json') as json_file:
json_data = json.load(json_file)
receptor_file = json_data['--receptor']
print 'Retrieving receptor file ' + receptor_file
ftp.retrbinary('RETR ' + receptor_file, open(receptor_file, 'wb').write)
ftp.cwd('Files')
ftp.retrlines('LIST')
filename = ftp.nlst()[0]
print 'Getting ' + filename
ftp.retrbinary('RETR ' + filename, open(filename, 'wb').write)
with open("Output.txt", "a") as input_file:
input_file.write('ligand = %s' %filename)
input_file.close()
ftp.delete(filename)
ftp.cwd('../Processing')
ftp.storbinary('STOR ' + filename, open(filename, 'rb'))
ftp.quit()
print "Processing"
return_code = subprocess.call(calls the program for processing files)
if return_code == 0:
print """Done!"""
ftp.connect(arguments.host_ip, arguments.host_port)
ftp.login("client", "password")
ftp.cwd('Results')
ftp.storbinary('STOR ' + os.path.splitext(filename)[0] + '_out.pdbqt', open (os.path.splitext(filename)[0] + '_out.pdbqt'))
ftp.cwd('../Processing')
ftp.delete(filename)
ftp.quit()
else:
print """Something is technically wrong..."""
ftp.connect(arguments.host_ip, arguments.host_port)
ftp.login("client", "password")
ftp.cwd('Files')
ftp.storbinary('STOR ' + filename, open(filename, 'rb'))
ftp.cwd('../Processing')
ftp.delete(filename)
ftp.quit()
谢谢您的帮助!