详解Python3的TFTP文件传输

  

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文件传输