Python的网络编程[5] -> BOOTP + TFTP + FTP -> 实现一个简单的文件传输流程
BOOTP-TFTP-FTP
目录
- 文件传输流程
- 服务器建立过程
- 客户端建立过程
1 文件传输流程 / File Transfer Flow
利用BOOTP,TFTP,FTP三种传输协议,建立起客户端和服务器,实现一个简单的文件传输流程。
- Server初始化运行,开启3个线程,分别运行BOOTP,TFTP,FTP的服务器,进行监听等待;
- Client发起BOOTP广播,请求响应,在收到服务器响应后,根据回传的ip和文件名,启动TFTP,发起RRQ文件下载,等待文件传输完成,Client继续利用BOOTP发起广播,并根据回传信息启动TFTP(此处利用BOOTP传送的IP作为连接TFTP的IP),直至BOOTP广播无响应(超时),则结束BOOTP及TFTP;
- 根据TFTP下载的文件,读取其中需要下载的文件内容,利用FTP客户端发起登录,请求下载对应文件,直至FTP文件下载完成,退出FTP及客户端。
Note: 三种传输协议的实现过程可参考文末的相关阅读,部分内容如文件路径和文件名等均为硬编码,后续可做修改。
2 服务器建立过程 / Server Setup
服务器建立步骤主要有:
(1) 实例化BOOTP,TFTP,FTP三个服务器;
(2) 开启三个线程,分别运行服务器并监听等待。
1 from BOOTP.BOOTPServer import BOOTPServer 2 from TFTP.TFTPServer import TFTPServer 3 from FTP.FTPServer import FTP_Server 4 5 class CommuniDemoServer(): 6 def __init__(self): 7 self.bootp = BOOTPServer() 8 self.tftp = TFTPServer() 9 self.ftp = FTP_Server() 10 11 def server_start(self): 12 self.bootp.start() 13 self.tftp.start() 14 self.ftp.start() 15 16 server = CommuniDemoServer() 17 server.server_start()
3 客户端器建立过程 / Client Setup
客户端建立步骤主要有:
(1) 实例化BOOTP,TFTP,FTP三个服务器;
(2) 建立循环,开启BOOTP广播,等待报文获取ip及文件名,开启TFTP下载对应文件。完成后继续广播请求,直至广播无回应;
(3) 打开TFTP下载的文件,获取需要下载的文件名,开启FTP进行下载。下载完成后结束FTP。
1 from BOOTP.BOOTPClient import BOOTPClient 2 from TFTP.TFTPClient import TFTPClient 3 from FTP.FTPClient import FTP_Client 4 5 class CommuniDemoClient(): 6 def __init__(self): 7 self.bootp = BOOTPClient() 8 self.tftp = TFTPClient() 9 self.ftp = FTP_Client() 10 11 def action(self): 12 while True: 13 recv = self.bootp.client_request() 14 if recv is None: 15 print('=== [BOOTP and FTTP] Action done') 16 break 17 self.tftp.server_ip = recv[0] 18 self.tftp.readRequest(recv[1]) 19 self.ftp.download(['etsw.b3']) 20 file_list = [] 21 try: 22 with open('TFTP\\TFTPClientFile\\copy-files4.rc') as f: 23 info_line = None 24 while info_line != '': 25 info_line = f.readline() 26 info = info_line.strip('\n').split(':') 27 if info != [''] and info != [' ']: 28 file_name = info[1] 29 if file_name != '' and file_name != ' ': 30 file_list.append(file_name.strip(' ')) 31 except FileNotFoundError: 32 print('=== [FTP] Download file no found') 33 exit() 34 self.ftp.download(file_list) 35 print('=== [FTP] Exit') 36 37 client = CommuniDemoClient() 38 client.action()
相关阅读
1. BOOTP 理论
3. TFTP 理论
5. FTP 理论