python-tcp实现文件上传下载
代码存在的问题:
1、没有实现用户输入的路径的检测(太懒了),用户输入的路径不存在会导致程序中断。
2、代码的复用率不高,还可以进行简化。
3、上传文件的路径需要手动输入。
4、本来不应该设置注册功能,应该只设置登录功能。
代码放在一个文件夹内:
1、download_file : 保存用户下载的文件
2、save_up_file: 保存用户上传的文件。
3、应该还有一个文件夹,里面存放着要共享给用户的文件
4、login_file:保存用户和加密的密码,格式:用户|密码(hmac加密后)
5、server.py 和client.py
服务端:
提供:登录/注册,上传文件,下载文件(指定目录下的文件)
使用的模块:
import struct 将数字转成四字节的字节码
import socketserver 实现并发访问
import hmac 密码加密
import os
import sys
import json
代码的实现:主要是验证区,实现用户登录注册功能;功能区,提供上传、下载文件的功能。
服务端的代码:
import struct
import socketserver
import hmac
import os
import sys
import json
#用户密码加密
def md5(pwd):
h = hmac.new(b'admin',pwd.encode('utf-8'))
ret = h.digest()
return ret
#读取login_file,返回字典
def read_login_file(path): #path=login_file
dic = {}
if os.path.exists(path):
with open(path, 'r', encoding='utf-8') as fp:
for line in fp:
key, value = line.strip().split('|')
dic[key] = value
return dic
else:
return False
#将更新后的字典写到 login_file中
def write_login_file(dic,path):#path=login_file
if os.path.exists(path):
with open(path,'w',encoding='utf-8')as fp:
for key in dic:
msg = key+'|'+str(dic[key])+'\n'
fp.write(msg)
return True
else:
return False
#接收用户发送的用户名和密码
def recv_user(con):
lis =[]
user_len = con.recv(4)#接收用户的pack后的字节码
leng = struct.unpack('i', user_len)[0]
user = con.recv(leng).decode('utf-8')
pwd_len = con.recv(4)
leng = struct.unpack('i', pwd_len)[0]
pwd = con.recv(leng).decode('utf-8')
lis.append(user)
lis.append(pwd)
return lis
#用户登录验证密码
def login(user,pwd,path):#con就是accept 的con,path=login_file
code_pwd = md5(pwd) #获取密码加密后的内容
'''#在write_login_file是,将加密后密码转成str,这里的code_pwd是bytes类型
所有要将code_pwd转成str类型,不然永远都不可能密码一样的。
'''
code_pwd=str(code_pwd)
dic = read_login_file(path)
# print(68,dic)
if user in dic and dic[user]==code_pwd:
return True #登录成功
else:
return
