服務端
import os,sys BASE_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(BASE_DIR) import socket import selectors class selectFtpServer(): def __init__(self): self.sel = selectors.DefaultSelector() self.create_socket() self.handle() def create_socket(self): server = socket.socket() server.bind(('127.0.0.1',8000)) server.listen(5) server.setblocking(False) self.sel.register(server, selectors.EVENT_READ, self.accept) print('開啓服務。。。') def handle(self): while True: events = self.sel.select() for key,mask in events: callback = key.data callback(key.fileobj,mask) def accept(self,sock,mask): conn,addr = sock.accept() conn.setblocking(False) self.sel.register(conn,selectors.EVENT_READ,self.read) def read(self,conn,mask): try: data = conn.recv(1024) if not data: raise Exception print('echoing',repr(data),'to',conn) conn.send(data) except Exception as e: print('closing',conn) conn.unregister(conn) conn.close()
if __name__ == '__main__': selectFtpServer()
客戶端
# -*- coding:utf-8 -*- import os,sys import socket import selectors BASE_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(BASE_DIR) class selectFtpClient(): # 初始化 def __init__(self): self.args = sys.argv # 接收命令行輸入 if len(self.args)>1: # 如果有值 self.port = (self.args[1],int(self.args[2])) # 把ip和端口分別值傳給 元組port else: self.port = ('127.0.0.1',8000) # 如果沒有傳入值 默認 self.create_socket() # 執行create方法 self.command_faout() # 然後執行這個 def create_socket(self): # 建立連接 try: self.sk = socket.socket() self.sk.connect(self.port) print("連接成功。。。") except Exception as e: print("except: ",e) def command_faout(self): # 輸入,輸出方法 while True: # 無限循環 cmd = input(">>>").strip() # 接收輸入 if cmd == "exit()": break cmd,file = cmd.split() # 寫入文件上傳put下載get 和文件文件路徑 if hasattr(self,cmd): # 判斷輸入的方法 func = getattr(self,cmd) # 如果有就去調用 func(cmd,file) # 調用方法 傳入值 else: print("調用錯誤。") def put(self,cmd,file): if os.path.isfile(file): fileName = os.path.basename(file) fileSize = os.path.getsize(file) fileInfo = '%s|%s|%s'%(cmd,fileName,fileSize) self.sk.send(bytes(fileInfo,encoding="utf-8")) recvStatus = self.sk.recv(1024) print('recvStatus', recvStatus) hasSend = 0 if str(recvStatus, encoding="utf-8") == 'OK': with open(file,'rb') as f: while fileSize > hasSend: contant = f.read(1024) recv_size = len(contant) self.sk.send(contant) hasSend += recv_size s = str(int(hasSend/fileSize*100))+"%" print("正在上傳文件:"+fileName+" 已上傳:"+s) print('%s上傳完成'%(fileName,)) else: print("文件不存在") def get(self): pass if __name__ == '__main__': selectFtpClient()