Python 3 의 TFTP 파일 전송 에 대한 자세 한 설명

7099 단어 Python3TFTP
TFTP 파일 전송
기능:
1.파일 목록 가 져 오기
2.파일 업로드
3.파일 다운로드
4.탈퇴
첫 번 째 부분,TftpServer 부분.
① 관련 모듈 가 져 오기

from socket import *
import os
import signal
import sys
import time
② 파일 경로 확인

#       
FILE_PATH = "/home/tarena/" 
③ 서버 기능 모듈 을 실현 하기 위해 클래스 를 만 듭 니 다.

class TftpServer(object): 
 def __init__(self, connfd): 
  self.connfd = connfd 
 
 def do_list(self): 
  #      
  file_list = os.listdir(FILE_PATH) 
  #             ,  Empty 
  if not file_list: 
   self.connfd.send('Empty'.encode()) 
   return 
  #       ,      OK 
  else: 
   self.connfd.send(b'OK') 
   time.sleep(0.1) 
 
  files = "" 
  for file in file_list: 
   #    '.'        
   if file[0] != '.' and \ 
     os.path.isfile(FILE_PATH + file): 
    files = files + file + '#' 
  #        
  self.connfd.send(files.encode()) 
 
 #        
 def do_get(self, filename): 
  try: 
   fd = open(FILE_PATH + filename, 'rb') 
  except: 
   self.connfd.send("File doesn't exist".encode()) 
   return 
  #        ,  OK 
  self.connfd.send(b"OK") 
  time.sleep(0.1) 
  #        
  try: 
   for line in fd: 
    self.connfd.send(line) 
   fd.close() 
  except Exception as e: 
   print(e) 
  time.sleep(0.1) 
  self.connfd.send(b'##') 
  print("File send over") 
 
 #        
 def do_put(self, filename): 
  try: 
   fd = open(FILE_PATH + filename, 'w') 
  except: 
   self.connfd.send("Some error") 
  #          ,   OK 
  self.connfd.send(b'OK') 
  #      
  while True: 
   # data      
   data = self.connfd.recv(1024).decode() 
   if data == "##": 
    break 
   fd.write(data) 
  fd.close() 
  print("    ") 
④ 주류 프로 세 스 제어

def main():
 #      /  /  
 HOST = '0.0.0.0'
 PORT = 8888
 ADDR = (HOST, PORT)

 sockfd = socket()
 #        
 sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
 #     
 sockfd.bind(ADDR)
 #         
 sockfd.listen(5)

 signal.signal(signal.SIGCHLD, signal.SIG_IGN)
 print("Listen to port 8888....")

 while True:
  try:
   connfd, addr = sockfd.accept()
  except KeyboardInterrupt:
   sockfd.close()
   sys.exit("Server exit")
  except Exception as e:
   print(e)
   continue
  print("Client login:", addr)
  #       
  pid = os.fork()
  if pid < 0:
   print("Process creation failed")
   continue
  elif pid == 0:
   #             ,      ,      
   sockfd.close()
   tftp = TftpServer(connfd)
   #        
   while True:
    data = connfd.recv(1024).decode()
    if not data:
     continue
    #   do_list        
    elif data[0] == 'L':
     tftp.do_list()
    # data ==> G filename
    #     G  ,          
    elif data[0] == 'G':
     filename = data.split(' ')[-1]
     tftp.do_get(filename)
    elif data[0] == 'P':
     filename = data.split(' ')[-1]
     tftp.do_put(filename)
    elif data[0] == 'Q':
     print("     ")
     sys.exit(0)

  else:
   connfd.close()
   continue
⑤ 주 제어 프로 세 스 를 실행 하고 클 라 이언 트 연결 을 기다린다.

if __name__ == "__main__": 
 main() 
두 번 째 부분,TftpClient
① 관련 모듈 가 져 오기

from socket import * 
import sys 
import time 
② 기본 적 인 요청 기능 구현

class TftpServer(object):
 def __init__(self, sockfd):
  self.sockfd = sockfd

 def do_list(self):
  self.sockfd.send(b"L") #       
  #           
  data = self.sockfd.recv(1024).decode()
  if data == 'OK':
   data = self.sockfd.recv(4096).decode()
   files = data.split('#')
   for file in files:
    print(file)
   print("%%%%%There is file list%%%%%
") else: # print(data) def do_get(self, filename): self.sockfd.send(('G '+filename).encode()) data = self.sockfd.recv(1024).decode() if data == 'OK': fd = open(filename, 'w') while True: data = self.sockfd.recv(1024).decode() if data == "##": break fd.write(data) fd.close() print("%s Download over
" % filename) else: print(data) def do_put(self, filename): try: fd = open(filename, 'rb') except: print("There is no such file") return self.sockfd.send(("P " + filename).encode()) data = self.sockfd.recv(1024).decode() if data == 'OK': for line in fd: self.sockfd.send(line) fd.close() time.sleep(0.1) self.sockfd.send(b'##') print("%s upload over" % filename) else: print(data) def do_quit(self): self.sockfd.send(b'Q')
③ 주류 프로 세 스 제어

#      
def main():
 if len(sys.argv) < 3:
  print("argv is error")
  return
 HOST = sys.argv[1]
 PORT = int(sys.argv[2])
 ADDR = (HOST, PORT)

 sockfd = socket()
 sockfd.connect(ADDR)

 tftp = TftpServer(sockfd) # tftp        

 while True:
  print("=======    ========")
  print("******* list *********")
  print("*******get file ******")
  print("*******put file ******")
  print("******* quit *********")
  print("======================")

  cmd = input("     >>")

  if cmd.strip() == 'list':
   tftp.do_list()
  elif cmd[:3] == "get":
   filename = cmd.split(' ')[-1]
   tftp.do_get(filename)
  elif cmd[:3] == "put":
   filename = cmd.split(' ')[-1]
   tftp.do_put(filename)
  elif cmd.strip() == "quit":
   tftp.do_quit()
   sockfd.close()
   sys.exit("Welcome")
  else:
   print("Enter the right order!!!")
   continue
④ 클 라 이언 트 실행

if __name__ == "__main__": 
 main() 
제3 부분 전시

한 번 에 하나씩 표시 하지 않 습 니 다.문제 가 있 으 면 번 거 로 운 점 을 수정 하고 함께 발전 합 니 다!

좋은 웹페이지 즐겨찾기