import socketserver
import hmac,os,hashlib
class MyServer(socketserver.BaseRequestHandler):
#—————————————以下为主函数执行体———————————————————#
def handle(self): #继承BaseRequestHandler后就要重写handle方法
print(self.request) #相当于coon
print(self.client_address) #相当于addr
self.check()
self.log_in()
#—————————————以上为主函数执行体———————————————————#
####################################################################################
#—————————————以下内容为验证连接合法性————————————————#
'''验证用户合法性,创建密钥,验证用户加密功能'''
def check(self):
serect_key = b'pandaboy'
print('开始用户端验证合法性....')
random_num = os.urandom(32)
self.request.sendall(random_num)
h = hmac.new(serect_key, random_num)
digest = h.digest()
respone = self.request.recv(len(digest))
judge = hmac.compare_digest(respone,digest)
if judge ==True:
print('验证已通过,可以传输')
else:
print('验证未通过,正在终止传输')
self.request.close()
#—————————————以上内容为验证连接合法性————————————————#
####################################################################################
#—————————————以下内容为用户加密验证————————————————#
def log_in(self):
while True:
try:
#发送登录初始化信息
self.request.sendall(bytes('请输入用户名:',encoding='utf-8'))
username = self.request.recv(1024)
print('用户名是:',username.decode('utf-8'))
self.request.sendall(bytes('请输入密码:', encoding='utf-8'))
password = self.request.recv(1024)
print('密码是:', password.decode('utf-8'))
with open(r'F:PythonPythonLeaningFTPServerdatabaseUserID ','r+',encoding='utf-8')
as f:
for line in f:
l = {'username':line.split()[0],'password':line.split()[1]}
if username.decode('utf-8') in l.get('username') and password.decode('utf-8') in l.get('password'):
username1 = username.decode('utf-8')
password2 = hashlib.md5(password)
print('验证成功,正在登陆
当前用户是%s
密码显示是%s'%(username1,password2))
self.request.sendall(bytes('您的用户名是:', encoding='utf-8'))
break
else :
print('未找到该用户,正在退出')
except Exception as e:
print('检测到异常的形式是',e)
break
#—————————————以上内容为用户加密验证————————————————#
if __name__ == '__main__':
# 多线程服务端,可以实现并发,可以同时开启多个任务等待链接,ThreadingTCPServer(tuple格式的(ip+prot),类名)
s = socketserver.ThreadingTCPServer(('192.168.55.1',8000),MyServer)
#永久服务,链接循环
s.serve_forever()