1,并发编程
1,什么是并发编程:在tcp协议中多个客户端访问同一个服务端的时候,由于tcp基本的网络连接方式是单线链接的,所以由此引出了并发编程,让多个客户端访问同一个服务端的情况就是并发编程。
2,socketserver模块的使用就是解决多客户端访问服务端的情况:
#并发编程需要注意的是服务端的接收,客户端按照以往的形式来就好 import socketserver class Myserver(sockerserver.BaseRequestHandler): def handler(self): while True: ret = self.resquest.recv(1024).decode('utf-8')#接收参数 print(ret) self.request.send('hi'.encode('utf-8'))#此处不能使用input方式 if __name__ == '__main__': socketserver.TCPServer.allow_reuse_address = True server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver) server.serve_forever() #服务端的基本结构并发编程方式 #client端口 import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) sk.send('nihaoi'.encode('utf-8')) t = sk.recv(1024).decode('utf-8') print(t) sk.close()
2,验证客户端的合法性
#server端口 import socket import os import hashlib secret_key = '老衲洗头用飘柔'.encode('utf-8') sk= socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,mag= sk.accept() random_bytes = os.urandom(32) #传输一个32位数的随机数字 conn.send(random_bytes) #发送过去 md5 = hashlib.md5(secret_key) #利用hashilb算法加密加盐 md5.update(random_bytes) 加密 ret = md5.hexdigest() end_recv = conn.recv(1024).decode('utf-8') if end_recv == ret: #两边判断 print('合法客户端') else: print('不合法客户端') conn.close() sk.close() #client import socket import hmac secret_key = '老衲洗头用飘柔'.encode('utf-8') sk= socket.socket() sk.connect(('127.0.0.1',9000)) # random_bytes = os.urandom(32) ret = sk.recv(1024) md5 = hmac.new(secret_key,ret) 加密方式不同但是思路相同 rt = md5.hexdigest() sk.send(rt.encode('utf-8')) print('----------') sk.close()