def my_put(self, arg): print('put...', arg) # 默认传home文件夹中的文件 —— “模拟本地” filepath = os.path.join(HOME_PATH, arg) if os.path.isfile(filepath) and os.path.exists(filepath): filename = os.path.basename(filepath) file_size = os.path.getsize(filepath) file_md5 = get_file_md5(filepath) dic = { 'file_exists': True, 'filename': filename, 'file_size': file_size, 'file_md5': file_md5 } # 将字典传给server——用协议 因为接着后面会传文件! pro_send(self.sk, dic) # 开始传文件 —— file_size参数是为了打印进度条的 file_send(self.sk, filepath) # 不用协议 收结果 dic = {'ret':False} ret = pro_recv(self.sk, False) if not ret['ret']: print_error('文件传输的过程有损坏!') else: print_correct('文件传输完成,经校验无误!') else: print_error('你的home文件夹中没有这个文件!') # 注意 由于arg参数已经传给server了,因此把错误的信息还得发给server,让那边做判断 dic = {'file_exists': False} # 将字典传给server——用协议 pro_send(self.sk, dic)
def my_del(self, arg): print('del...', arg) # 接收server端返回的字典 不用协议 dic = pro_recv(self.sk, False) #dic = {'ret':False,'msg':None} if not dic['ret']: print_error(dic['msg']) else: print_correct('成功删除 %s' % arg)
def my_mkdir(self, arg): # print('mkdir...',arg) # 接收结果字典 dic = {'ret':False,'msg':None} dic = pro_recv(self.sk, False) if not dic['ret']: print_error(dic['msg']) else: print_correct('创建目录成功!')
def my_pwd(self): # print('pwd...') dic = {'opt': 'pwd', 'arg': ''} # 直接发给server, server做反射时不用协议接收 这里也不用协议 pro_send(self.sk, dic, False) # 接收结果 {'ret':self.current_dir} dic = pro_recv(self.sk, False) print_correct('当前路径为:%s' % dic['ret'])
def login(sk): username = input('请输入用户名:').strip() password = input('请输入密码:').strip() dic = {'opt':'login','username':username,'password':password} # 用协议传输 pro_send(sk,dic) # 接收结果字典 不用协议 ret_dic = pro_recv(sk,False) if ret_dic['ret']: # 返回用户名 return username else: return False
def conn_auth(sk): ''' 验证客户端到服务器的链接 ''' msg = sk.recv(32) # 注意 这里是bytes类型的! h = hmac.new((SECRET_KEY).encode('utf-8'), msg) digest = h.digest() sk.sendall(digest) # 从server端接收结果 # server端没用协议 我们也不用 dic = pro_recv(sk,False) # 认证成功 if dic['ret']: return True else: return False
def my_dir(self, arg): # print('dir...',arg) # 接收server端的结果 用协议!结果可能会很大,会产生粘包 dic = pro_recv(self.sk) total_size = dic['total_size'] # 接收规则: recv_size = 0 recv_data = self.sk.recv(total_size) # while recv_size < total_size: # # 每次接收1024 # ret = self.sk.recv(1024) # recv_data += ret # # 注意recv_size 每次加接收数据的长度——每一次不一定收1024 # recv_size += len(ret) # else: # ret = self.sk.recv(1024) # if ret: # recv_data += ret # # 注意 win系统 解码成 gbk cmd_ret = recv_data.decode('gbk') print(cmd_ret)
def my_get(self, arg): print('get...', arg) # 接收结果的字典 dic = pro_recv( self.sk ) # {'exists':False,'filename':None,'file_size':None,'msg':'','file_md5':None} if not dic['exists']: print_error(dic['msg']) else: filename = dic['filename'] file_size = dic['file_size'] file_md5 = dic['file_md5'] # 开始接收文件 # 默认接收到download文件夹中 download_path = os.path.join(DOWNLOAD_PATH, filename) file_recv(self.sk, download_path, file_size) recv_file_md5 = get_file_md5(download_path) # 返回给server的结果字典 {'ret':True} 不用协议发 if recv_file_md5 == file_md5: dic = {'ret': True} pro_send(self.sk, dic, False) print_correct('文件传输完成,经校验后无误!')
def my_cd(self, arg): # print('cd...',arg) # 不用协议接收返回的字典 dic = {'ret':False,'ret_lis':[]} dic = pro_recv(self.sk, False) if not dic['ret']: print_error(dic['ret_lis'][0])