TFTP文件传输
功能:
1,获取文件列表
2,上传文件
3,下载文件
4,退出
第一部分,TftpServer部分。
①导入相关模块
从套接字进口* 进口操作系统 输入信号 导入系统 导入时间
②确定文件路径
#文件库路径 FILE_PATH="/home/tarena/"
③建立一个类,用来实现服务器功能模块
类TftpServer(对象): def __init__(自我,connfd): 自我。connfd=connfd def do_list(自我): #获取列表 file_list=os.listdir (FILE_PATH) #如果对应的路径内没有文件,返回空的 如果不是file_list: self.connfd.send(“空”.encode ()) 返回 #路径存在文件,向客户端发送好了 其他: self.connfd.send (b 'OK”) time . sleep (0.1) 文件=" " 在file_list文件: #排除以“。”开头的隐藏文件 如果文件[0]!=薄!?\ os.path。isfile (FILE_PATH +文件): 文件=文件+ +“#” #返回文件列表 self.connfd.send (files.encode ()) #下载文件功能 def do_get(自我,文件名): 试一试: fd=开放(FILE_PATH +文件名,rb) 除了: self.connfd。发送("文件不存在" .encode ()) 返回 #如果能正常打开,发送好了 self.connfd.send (b“OK”) time . sleep (0.1) #开始发送文件 试一试: 在fd: self.connfd.send(线) fd.close () 除了例外e: 打印(e) time . sleep (0.1) self.connfd.send (b“# #”) 打印(“文件发送”) #开始上传文件 def do_put(自我,文件名): 试一试: fd=开放(FILE_PATH +文件名,“w”) 除了: self.connfd。发送(“错误”) #如果能正常打开文件,则发送好了 self.connfd.send (b 'OK”) #开始发送 而真正的: #数据为文件内容 data=https://www.yisu.com/zixun/self.connfd.recv (1024) .decode () 如果数据==? #”: 打破 fd.write(数据) fd.close () 打印(“上传完毕”)
④主流程控制
def main (): #创建套接字/地址/端口 主机=' 0.0.0.0 ' 端口=8888 ADDR=(主机、端口) sockfd=套接字() #设置端口可重用 sockfd。setsockopt (SOL_SOCKET SO_REUSEADDR 1) #绑定地址 sockfd.bind (ADDR) #设置监听队列大小 sockfd.listen (5) signal.signal(信号。SIGCHLD signal.SIG_IGN) 打印(“听端口8888 ....”) 而真正的: 试一试: connfd addr=sockfd.accept () 除了KeyboardInterrupt: sockfd.close () sys。退出(退出“服务器”) 除了例外e: 打印(e) 继续 打印(“客户端登录:“addr) #创建父子进程 pid=os.fork () 如果pid & lt;0: 打印(“进程创建失败”) 继续 elif pid==0: #子进程负责请求接收和发送,所以节省资源,关闭连接套字 sockfd.close () tftp=TftpServer (connfd) #接收客户端请求 而真正的: data=connfd.recv (1024) .decode () 如果没有数据: 继续 #调用do_list方法获取文件列表 elif数据[0]==癓”: tftp.do_list () #=https://www.yisu.com/zixun/=> G数据文件名 #文件名以G开的头,以空格为间隔发送过来 elif数据[0]==瓽’: 文件名=数据。分割(' ')[1] tftp.do_get(文件名) elif数据[0]==癙”: 文件名=数据。分割(' ')[1] tftp.do_put(文件名) elif数据[0]==拔省? 打印(“客户端退出”) sys.exit (0) 其他: connfd.close () 继续
⑤运行主控制流程,等待客户端连接
if __name__==癬_main__”: main ()
第二部分,TftpClient
①导入相关模块
从套接字进口* 导入系统 导入时间
②实现基本的请求功能
类TftpServer(对象): def __init__(自我,sockfd): 自我。sockfd=sockfd def do_list(自我): self.sockfd.send (b“L”) #发送请求类型 #等待接收服务器端确认 data=https://www.yisu.com/zixun/self.sockfd.recv (1024) .decode () 如果数据==昂谩? data=https://www.yisu.com/zixun/self.sockfd.recv (4096) .decode () 文件=data.split (“#”) 文件的文件: 打印(文件) 打印(“% % % % %有文件列表% % % % % \ n”) 其他: #失败的原因由服务器发送过来 打印(数据) def do_get(自我,文件名): self.sockfd。发送((“G”+文件名).encode ()) data=https://www.yisu.com/zixun/self.sockfd.recv (1024) .decode () 如果数据==昂谩? fd=open (filename ' w ') 而真正的: data=https://www.yisu.com/zixun/self.sockfd.recv (1024) .decode () 如果数据==? #”: 打破 fd.write(数据) fd.close () 打印(“% s下载/\ n”%文件名) 其他: 打印(数据) def do_put(自我,文件名): 试一试: fd=open (filename, rb) 除了: 打印(“没有这样的文件”) 返回 self.sockfd。发送((P +文件名).encode ()) data=https://www.yisu.com/zixun/self.sockfd.recv (1024) .decode () 如果数据==昂谩? 在fd: self.sockfd.send(线) fd.close () time . sleep (0.1) self.sockfd.send (b“# #”) 打印(“% s上传/?文件名) 其他: 打印(数据) def do_quit(自我): self.sockfd.send (b 'Q”)详解Python3的TFTP文件传输