- 多用户同时登陆
用户登陆,加密认证
3. 上传/下载文件,保证文件一致性
传输过程中现实进度条
5. 不同用户家目录不同,且只能访问自己的家目录
服务端
import socketserver
import struct
import json
import os
import hashlib
class MyServer(socketserver.BaseRequestHandler):
def login(self): # 登录
u,p = self.request.recv(1024).decode('utf-8').split('|')
with open('user pwd',mode='r',encoding= 'utf-8') as f:
for line in f:
user,pwd = line.strip().split('|')
if u == user and p == pwd:
self.request.send('登录成功'.encode('utf-8'))
return True
self.request.send('登录失败'.encode('utf-8'))
return False
def register(self): # 注册
u_name,p_word = self.request.recv(1024).decode('utf-8').split('|')
md5 = hashlib.md5()
md5.update(p_word)
md5_word = md5.hexdigest()
with open('user pwd',mode='r',encoding='utf-8') as f:
for line in f:
user,pwd = line.strip().split('|')
if u_name == user:
self.request.send('注册失败'.encode('utf-8'))
return False
with open('user pwd',mode= 'a',encoding='utf-8') as f:
f.write(f'{u_name}|{md5_word}\n')
self.request.send('注册成功'.encode('utf-8'))
return True
def upload(self): # 上传文件
four_bytes = self.request.recv(4)
dic_len = struct.unpack('i',four_bytes)[0]
dic_bytes = self.request.recv(dic_len).decode('utf-8')
dic = json.loads(dic_bytes)
print(dic)
with open(os.path.join(os.path.dirname('上传文件'),dic['file_name']),mode='wb') as f:
total_size = 0
md5 = hashlib.md5()
while total_size < dic['file_size']:
every_data = self.request.recv(1024)
if every_data:
md5.update(every_data)
f.write(every_data)
total_size += len(every_data)
else:
break
if md5.hexdigest() == dic['file_md5']:
self.request.send('上传成功'.encode('utf-8'))
else:
self.request.send('上传失败'.encode('utf-8'))
os.remove(os.path.join(os.path.dirname('上传文件'),dic['file_name']))
def download(self): # 下载文件
directory = os.listdir(os.path.dirname(__file__))
s = ''
for n,file_name in enumerate(directory ,1):
s += f'序号:{n}\t文件名{file_name}\n'
dir_name = f'文件如下:\n{s}'
self.request.send(dir_name.encode('utf-8'))
choice = self.request.recv(1024).decode('utf-8')
md5 = hashlib.md5()
with open(os.path.join(os.path.dirname(__file__),directory[int(choice) - 1]), mode='rb') as f:
while 1:
data = f.read(1024)
if data:
md5.update(data)
else:
break
dic = {'file_name':directory[int(choice)-1],
'file_size':os.path.getsize(os.path.join(os.path.dirname(__file__),directory[int(choice) - 1])),
'file_md5':md5.hexdigest()}
dic_json = json.dumps(dic)
dic_json_bytes = dic_json.encode('utf-8')
dic_len = len(dic_json_bytes)
four_bytes = struct.pack('i',dic_len)
self.request.send(four_bytes)
self.request.send(dic_json_bytes)
with open(os.path.join(os.path.dirname(__file__), directory[int(choice) - 1]), mode='rb')as f:
while 1:
data = f.read(1024)
if data:
self.request.send(data)
else:
break
def handle(self):
choice = self.request.recv(1024).decode('utf-8')
if choice == '1':
ret = self.login()
if ret:
while 1:
choice = self.request.recv (1024).decode('utf-8')
if choice == '1':
self.upload()
elif choice == '2':
self.download()
elif choice :
ret = self.register()
if ret:
while 1:
choice = self.request.recv (1024).decode('utf-8')
if choice == '1':
self.upload()
elif choice == '2':
self.download()
if __name__ == '__main__':
ip_port = ('192.168.137.39',9999)
socketserver.TCPServer.allow_reuse_address = True;
server = socketserver.ThreadingTCPServer(ip_port,MyServer)
server.serve_forever()
客户端
import socket
import hashlib
import os
import struct
import json
client = socket.socket()
client.connect(('192.168.137.39',9999))
def login(): # 登录
user = input('用户名').strip()
pd = input('密码').strip()
md5 = hashlib.md5()
md5.update(pd.encode('utf-8'))
pwd = md5.hexdigest()
client.send(f'{user}|{pwd}'.encode('utf-8'))
f_s = client.recv(1024).decode('utf-8')
if f_s == '登录成功':
print('登录成功')
return True
else:
print('登录失败')
return False
def register(): # 注册
user = input('用户名').strip()
p_word = input('密码').strip()
md5 = hashlib.md5()
md5.update(p_word.encode('utf-8'))
pwd = md5.hexdigest()
client.send(f'{user}|{pwd}'.encode('utf-'))
result = client.recv(1024).decode('utf-8')
if result == '注册成功':
print(result)
return True
else:
print(result)
return False
def upload(): # 上传文件
path = input('请输入路径').strip()
md5 = hashlib.md5()
with open(path,mode='rb') as f:
while 1:
data = f.read(1024)
if data:
md5.update(data)
else:
break
dic = {'file_name':os.path.basename(path),
'file_size':os.path.getsize(path),
'file_md5': md5.hexdigest()}
dic_json = json.dumps(dic)
dic_json_bytes = dic_json.encode('utf-8')
dic_len = len(dic_json_bytes)
four_bytes = struct.pack('i',dic_len)
client.send(four_bytes)
client.send(dic_json_bytes )
with open(path,mode='rb') as f:
while 1:
data = f.read(1024)
if data:
client.send(data)
else:
break
print(client.recv(1024).decode('utf-8'))
def download(): # 下载文件
dir_name = client.recv(1024).decode('utf-8')
print(dir_name)
choice = input('请输入你的选择').strip()
client.send(choice.encode('utf-8'))
four_bytes = client.recv(4)
dic_len = struct.unpack('i',four_bytes)[0]
dic_bytes = client.recv(dic_len).decode('utf-8')
dic = json.loads(dic_bytes)
print(dic)
with open(os.path.join(os.path.dirname(__file__),'下载',dic['file_name']),mode='wb') as f:
total_size = 0
md5 = hashlib.md5()
while total_size < dic['file_size']:
every_data = client.recv(1024)
if every_data:
md5.update(every_data)
f.write(every_data)
total_size += len(every_data)
else:
break
if md5.hexdigest() == dic['file_md5']:
print('下载成功')
else:
print('下载失败')
os.remove(os.path.join(os.path.dirname(__file__),dic['file_name']))
choice = input('请选择:\n1:登录 2:注册').strip()
client.send(choice.encode('utf-8'))
if choice == '1':
ret = login()
if ret:
while 1:
choice = input('请选择:\n1:上传文件 2:下载文件')
client.send(choice.encode('utf-8'))
if choice == '1':
upload()
elif choice == '2':
download()
elif choice == '2':
ret = register()
if ret:
while 1:
choice = input('请选择:\n1:上传文件 2:下载文件')
client.send(choice.encode('utf-8'))
if choice == '1':
upload()
elif choice == '2':
download()
client.close()