初级版python登录验证,上传下载文件加MD5文件校验
生活随笔
收集整理的這篇文章主要介紹了
初级版python登录验证,上传下载文件加MD5文件校验
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
服務(wù)器端程序
import socket import json import struct import hashlib import osdef md5_code(usr, pwd):ret = hashlib.md5(usr.encode())ret.update(pwd.encode())return ret.hexdigest()def login():recv_msg = conn.recv(1024).decode()msg_dic = json.loads(recv_msg)with open('user_msg', 'r', encoding='utf-8') as f1, \open('user_msg', 'a', encoding='utf-8') as f2:for con in f1:con_li = con.strip().split()if con_li[0] == msg_dic['username'] and con_li[1] == md5_code(msg_dic['username'], msg_dic['password']):flag = json.dumps({'flag': 1})conn.send(flag.encode())return {'flag': 1}else:flag = json.dumps({'flag': 0})conn.send(flag.encode())content = msg_dic['username'] + '\t' + md5_code(msg_dic['username'], msg_dic['password']) + '\n'f2.write(content)return {'flag': 0}def upload():dic_len = conn.recv(4)dic_size = struct.unpack('i', dic_len)[0]file_info = json.loads(conn.recv(dic_size))f1 = open(file_info['filename'], 'wb')md5_data = hashlib.md5()while file_info['filesize'] > 0:# 在最后接收文件不足2048時(shí)接收精準(zhǔn)字節(jié),避免與后面發(fā)送的數(shù)據(jù)發(fā)生粘包if 0 < file_info['filesize'] < 1204:content = conn.recv(file_info['filesize'])else:content = conn.recv(2048)md5_data.update(content)f1.write(content)# 每次減去實(shí)際接收的文件長(zhǎng)度可以避免tcp協(xié)議拆包時(shí)實(shí)際接收到的數(shù)據(jù)沒(méi)有2048而導(dǎo)致接收數(shù)據(jù)不完整file_info['filesize'] -= len(content)f1.close()# 獲得校驗(yàn)后的md5值md5sum = md5_data.hexdigest()# 接收客戶端校驗(yàn)后的md5值recv_md5 = conn.recv(32).decode()if md5sum == recv_md5:print('校驗(yàn)成功')return {'flag': 1}else:print('校驗(yàn)失敗')return {'flag': 0}def download():dic_len = conn.recv(4)dic_size = struct.unpack('i', dic_len)[0]file_info = json.loads(conn.recv(dic_size))file_size = os.path.getsize(file_info['filename'])dir_list = os.listdir('.')dfile_info = {'filesize': file_size, 'operate': 'download', 'dir_list': dir_list}file_dic = json.dumps(dfile_info).encode()file_len = struct.pack('i', len(file_dic))# 發(fā)送文件信息 conn.send(file_len)conn.send(file_dic)f1 = open(file_info['filename'], 'rb')md5_data = hashlib.md5()while file_size:content = f1.read(2048)md5_data.update(content)file_size -= len(content)conn.send(content)f1.close()md5sum = md5_data.hexdigest()print(md5sum)conn.send(md5sum.encode())return {'flag': 1}server = socket.socket() server.bind(('127.0.0.1', 8001)) server.listen(5) conn, addr = server.accept()login_ret = login() if login_ret['flag']:while login_ret['flag']:recv_cmd = conn.recv(1024).decode()cmd_dic = json.loads(recv_cmd)if cmd_dic['cmd'] == '1':print('上傳文件中')upload()elif cmd_dic['cmd'] == '2':print('下載文件中')download()elif cmd_dic['cmd'] == '3':break else:print('請(qǐng)重新登錄')conn.close() server.close()
?
客戶端程序
import os import json import socket import struct import hashlib # import timedef login():usr = input('請(qǐng)輸入用戶名:')pwd = input('請(qǐng)輸入密碼:')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}def upload():# F:\test.mp4file_path = input('請(qǐng)輸入文件路徑:')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))# 發(fā)送文件信息 client.send(file_len)client.send(file_dic)total_size = file_size# 打開(kāi)文件準(zhǔn)備上傳文件md5_data = hashlib.md5()f1 = open(file_path, 'rb')while file_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}def download():# F:\test.mp4file_name = input('請(qǐng)輸入文件名:')file_info = {'filename': file_name, 'operate': 'download'}file_dic = json.dumps(file_info).encode()file_len = struct.pack('i', len(file_dic))# # 發(fā)送文件信息 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時(shí)接收精準(zhǔn)字節(jié),避免與后面發(fā)送的數(shù)據(jù)發(fā)生粘包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('校驗(yàn)成功')return {'flag': 1}else:print('校驗(yàn)失敗')return {'flag': 0}# print('下載成功!')# return {'flag': 1}def choose_cmd():print('''1.上傳文件2.下載文件3.退出上傳下載文件''')cmd = input('請(qǐng)輸入序號(hào)選擇相應(yīng)操作')dic = {'cmd': cmd}cmd_dic = json.dumps(dic).encode()client.send(cmd_dic)return dicclient = 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':breakelse:print('輸入的序號(hào)有誤') else:print('請(qǐng)重新登錄')client.close()
?
轉(zhuǎn)載于:https://www.cnblogs.com/chen55555/p/10318267.html
總結(jié)
以上是生活随笔為你收集整理的初级版python登录验证,上传下载文件加MD5文件校验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 赵薇原来是庄主!她的酒庄在哪?
- 下一篇: vue打包配置