TFTP文件傳輸
功能:
1、獲取文件列表
2、上傳文件
3、下載文件
4、退出
第一部分,TftpServer部分。
①導(dǎo)入相關(guān)模塊
from socket import *import osimport signalimport sysimport time
②確定文件路徑
# 文件庫(kù)路徑 FILE_PATH = "/home/tarena/"
③建立一個(gè)類(lèi),用來(lái)實(shí)現(xiàn)服務(wù)器功能模塊
class TftpServer(object): def __init__(self, connfd): self.connfd = connfd def do_list(self): # 獲取列表 file_list = os.listdir(FILE_PATH) # 如果對(duì)應(yīng)的路徑內(nèi)沒(méi)有文件,返回Empty if not file_list: self.connfd.send('Empty'.encode()) return # 路徑存在文件,向客戶(hù)端發(fā)送OK else: self.connfd.send(b'OK') time.sleep(0.1) files = "" for file in file_list: # 排除以'.'開(kāi)頭的隱藏文件 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 # 如果能正常打開(kāi),發(fā)送OK self.connfd.send(b"OK") time.sleep(0.1) # 開(kāi)始發(fā)送文件 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") # 開(kāi)始上傳文件 def do_put(self, filename): try: fd = open(FILE_PATH + filename, 'w') except: self.connfd.send("Some error") # 如果能正常打開(kāi)文件,則發(fā)送OK self.connfd.send(b'OK') # 開(kāi)始發(fā)送 while True: # data為文件內(nèi)容 data = self.connfd.recv(1024).decode() if data == "##": break fd.write(data) fd.close() print("上傳完畢")
④主流程控制
def main(): # 創(chuàng)建套接字/地址/端口 HOST = '0.0.0.0' PORT = 8888 ADDR = (HOST, PORT) sockfd = socket() # 設(shè)置端口可重用 sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 綁定地址 sockfd.bind(ADDR) # 設(shè)置監(jiān)聽(tīng)隊(duì)列大小 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) # 創(chuàng)建父子進(jìn)程 pid = os.fork() if pid < 0: print("Process creation failed") continue elif pid == 0: # 子進(jìn)程負(fù)責(zé)請(qǐng)求接收和發(fā)送,所以節(jié)省資源,關(guān)閉連接套字 sockfd.close() tftp = TftpServer(connfd) # 接收客戶(hù)端請(qǐng)求 while True: data = connfd.recv(1024).decode() if not data: continue # 調(diào)用do_list方法獲取文件列表 elif data[0] == 'L': tftp.do_list() # data ==> G filename # 文件名以G開(kāi)頭,以空格為間隔發(fā)送過(guò)來(lái) 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("客戶(hù)端退出") sys.exit(0) else: connfd.close() continue
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注