服务端
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()