1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| import socketserver import pickle import os from config import sys import struct import hashlib ''' 功能列表 ''' class Action: def __init__(self, conn): self.conn = conn self.username = None self.pwd = None def login(self, username, pwd): self.username = username self.pwd = pwd
def file_md5(self, file_path): md5 = hashlib.md5(b'tony') with open(file_path, 'rb') as f: for line in f: md5.update(line) return md5.hexdigest()
def upload(self, file_info): file_dir = os.path.join(sys.UPLOAD_PATH, self.username) file_name = os.path.basename(file_info['file_path']) file_md5_path = os.path.join(file_dir, file_info['file_md5']) print(file_info, file_dir, '执行了服务器上传') if not os.path.exists(file_dir): os.makedirs(file_dir) exists_size = os.path.getsize(file_md5_path) if os.path.exists(file_md5_path) else 0 self.conn.send(struct.pack('i', exists_size)) with open(file_md5_path, 'ab') as f: while exists_size < file_info['file_size']: data = self.conn.recv(1024) exists_size += len(data) f.write(data) os.rename(file_md5_path, os.path.join(file_dir, file_name)) def download(self, cmd_info):
file_dir = os.path.join(sys.UPLOAD_PATH, self.username) file = os.path.join(file_dir, cmd_info['file_path']) print(cmd_info, file_dir, file, os.path.exists(file)) if not os.path.exists(file): self.conn.send(pickle.dumps({'code':1004, 'msg':'您要下载的文件不存在'})) else: file_size = os.path.getsize(file) print(file_size) self.conn.send(pickle.dumps({'file_size':file_size, 'file_md5':self.file_md5(file)})) exists_size = struct.unpack('i', self.conn.recv(4))[0] with open(file, 'rb') as f: f.seek(exists_size) while exists_size < file_size: data = f.read(1024) exists_size += len(data) self.conn.send(data)
''' 主程序 ''' class Server(socketserver.BaseRequestHandler): def handle(self): print(self.client_address, '已经成功连接至服务器……') action = Action(self.request) if action.username: self.request.send(pickle.dumps({'code': 1000, 'msg': '您已登录,请输入您要执行的命令:'})) else: self.request.send(pickle.dumps({'code': 1001, 'msg': '请输入用户名和密码:'})) pickle_user = pickle.loads(self.request.recv(1024)) action.login(pickle_user['username'], pickle_user['pwd']) while 1: try: cmd_info = pickle.loads(self.request.recv(1024)) if hasattr(action, cmd_info['cmd']): getattr(action, cmd_info['cmd'])(cmd_info) except Exception as e: break self.request.close() print(self.client_address, '已经断开服务器……') def run(): server = socketserver.ThreadingTCPServer(sys.IP_PORT, Server) server.serve_forever() print('系统开始运行……')
|