# 客户端
import socket
import hashlib
import json
import os
import struct
sk = socket.socket() # 实例化
sk.connect(('127.0.0.1', 8090)) # 请求连接
def login():
dic = {'status': False, 'username': None, 'password': None}
c = 3
while c: # 只循环3次
username = input('请输入用户名:')
password = input('请输入密码:')
md5_obj = hashlib.md5(password.encode('utf-8')) # 加密
md5_obj.update(username.encode('utf-8')) # 加盐
pwd = md5_obj.hexdigest() # 生成最终的密文
dic['username'] = username
dic['password'] = pwd
str_dic = json.dumps(dic) # 序列化
sk.send(str_dic.encode('utf-8'))
res_dic = sk.recv(1024).decode('utf-8')
result = json.loads(res_dic) # 反序列化
if result['status']: # 判断目前用户的状态
print('登陆成功')
break
else:
print('失败,%s' % result['reason'])
c -= 1
def main():
login()
main()
# 服务器端
import socketserver
import json
import hashlib
import socket
import struct
import os
class MySocket(socketserver.BaseRequestHandler): # socketserver.BaseRequestHandler 永久开启服务器需要的基类
def handle(self): # handle是一个固定写法
sor = '王'.encode('utf-8') # 加密需要的盐
while 1:
str_dic = self.request.recv(1024).decode('utf-8')
if not str_dic:break # 用来退出循环,当str_dic为空时退出
print(str_dic)
dic = json.loads(str_dic) # 反序列化
if not dic['status']:
'''没有登录'''
with open('info','r',encoding='utf-8') as f:
for info in f:
username, password = info.strip().split('|')
if dic['username'] == username: #
'''用户名存在'''
md5_obj = hashlib.md5(dic['password'].encode('utf-8'))
md5_obj.update(sor)
pwd_m = md5_obj.hexdigest()
if password == pwd_m:
'''密码正确'''
dic['status'] = True
else:
'''密码错误'''
dic['reason'] = '密码错误'
break
else:
'''用户名不存在'''
dic['reason'] = '用户名不存在'
res_dic = json.dumps(dic)
self.request.send(res_dic.encode('utf-8'))
else:
'''登录成功'''
break
b_len_dic = self.request.recv(4)
len_dic = struct.unpack('i', b_len_dic)[0] # 解决粘包的方法
str_dic = self.request.recv(len_dic).decode('utf-8')
dic = json.loads(str_dic)
if dic['opt'] == 'upload': # 上传
filename = '1' + dic['filename']
with open(filename, 'ab') as f:
while dic['filesize']:
content = self.request.recv(1024)
f.write(content)
dic['filesize'] -= len(content)
elif dic['opt'] == 'download': # 下载
file_path = self.request.recv(1024).decode('utf-8')
filename = os.path.basename(file_path)
filesize = os.path.getsize(file_path)
dic['filename'] = filename
dic['filesize'] = filesize
str_dic1 = json.dumps(dic)
len_dic1 = len(str_dic1)
b_len_dic1 = struct.pack('i', len_dic1)
self.request.send(b_len_dic1 + str_dic1.encode('utf-8'))
with open(filename, 'rb') as f:
while dic['filesize']:
content = f.read(1024)
self.request.send(content)
dic['filesize'] -= len(content)