importosimportjsonimportsocketimportstructimporthashlib#import time
deflogin():
usr= input('请输入用户名:')
pwd= input('请输入密码:')
usr_info_dic= {'username': usr, 'password': pwd, 'operate': 'login'}
usr_info=json.dumps(usr_info_dic).encode()
client.send(usr_info)
ret= client.recv(1024).decode()
flag_dic=json.loads(ret)if flag_dic['flag']:print('登录成功')return {'flag': 1}else:print('登录失败')return {'flag': 0}defupload():#F:\test.mp4
file_path = input('请输入文件路径:')
file_size=os.path.getsize(file_path)
file_name=os.path.basename(file_path)
file_info= {'filesize': file_size, 'filename': file_name, 'operate': 'upload'}
file_dic=json.dumps(file_info).encode()
file_len= struct.pack('i', len(file_dic))#发送文件信息
client.send(file_len)
client.send(file_dic)
total_size=file_size#打开文件准备上传文件
md5_data =hashlib.md5()
f1= open(file_path, 'rb')whilefile_size:
content= f1.read(2048*10)
md5_data.update(content)
file_size-=len(content)
client.send(content)print('\r已上传%s%%' % int((1 - file_size / total_size) * 100), end='')print('上传成功!')
f1.close()
md5sum=md5_data.hexdigest()print(md5sum)#time.sleep(0.1)
client.send(md5sum.encode())return {'flag': 1}defdownload():#F:\test.mp4
file_name = input('请输入文件名:')
file_info= {'filename': file_name, 'operate': 'download'}
file_dic=json.dumps(file_info).encode()
file_len= struct.pack('i', len(file_dic))## 发送文件信息
client.send(file_len)
client.send(file_dic)
dic_len= client.recv(4)
dic_size= struct.unpack('i', dic_len)[0]
dfile_info=json.loads(client.recv(dic_size))
md5_data=hashlib.md5()for dir_index, dir_name in enumerate(dfile_info['dir_list']):print(dir_index, dir_name)
total_size= dfile_info['filesize']
f1= open('down' + file_name, 'wb')while dfile_info['filesize'] >0:#在最后接收文件不足2048时接收精准字节,避免与后面发送的数据发生粘包
if 0 < dfile_info['filesize'] < 1204:
content= client.recv(dfile_info['filesize'])else:
content= client.recv(2048)
md5_data.update(content)
f1.write(content)
dfile_info['filesize'] -=len(content)print('\r已下载%s%%' % int((1-dfile_info['filesize'] / total_size) * 100), end='')
f1.close()
md5sum=md5_data.hexdigest()#print('\n', md5sum)
recv_md5= client.recv(32).decode()#print(recv_md5)
if md5sum ==recv_md5:print('校验成功')return {'flag': 1}else:print('校验失败')return {'flag': 0}#print('下载成功!')
#return {'flag': 1}
defchoose_cmd():print('''1.上传文件
2.下载文件
3.退出上传下载文件''')
cmd= input('请输入序号选择相应操作')
dic= {'cmd': cmd}
cmd_dic=json.dumps(dic).encode()
client.send(cmd_dic)returndic
client=socket.socket()#client.connect(('192.168.13.13', 8001))
client.connect(('127.0.0.1', 8001))
login_ret=login()if login_ret['flag']:while login_ret['flag']:
cmd_ret=choose_cmd()if cmd_ret['cmd'] == '1':
upload()elif cmd_ret['cmd'] == '2':
download()elif cmd_ret['cmd'] == '3':break
else:print('输入的序号有误')else:print('请重新登录')
client.close()