网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接
我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗? 那不可能的 你肯定要进行限定的
验证客户端链接的合法性:
hamc模块
hamc也是一个加密的模块
但是只能对字节进行加密
import hmac
s = '老王'.encode('UTF-8') n = hmac.new(key = s) print(n.hexdigest()) # 6afd402b51938e21ee2ace13ddf0ead1
它的加密的后面还可以选择加密的情况 但是只能对字节
import hmac import os t = os.urandom(30) # os.urandom 是随机获取字节数 s = '老王'.encode('UTF-8') n = hmac.new(key = s,msg= t) # 只对30个字节进行加密 print(n.hexdigest()) # 909271871e55dc492febe63fea8776dd
这个时候我们就用到了一个类似于之前的hashlib模块的加密了hamc模块,hmac模块是专门用来判断合法性的
server端口 import os import hmac import socket soctet_key = '老王在隔壁'.encode('UTF-8') sk = socket.socket() sk.bind(('127.0.0.3',9080)) sk.listen() while True: while True: try: conn,addr = sk.accept() random_bytes = os.urandom(30) # 随机获取一段字节 os模块的os.uurandom是专门随机获取字节的 conn.send(random_bytes) # 先把你的加密方式发送过去 obj = hmac.new(key = socket_key,smg = random_bytes ) # 这是运用hmac对你的信息进行加密 前面的是内容后面是加密的方式 ret = obj.hecdigest() msg = conn.recv(1024).decode('UTF-8') if msg == ret :print('是合法的') else:conn.close() finally: sk.close() break client端口: import socket import hmac socket_key = '老王在隔壁'.encode('UTF-8') sk = socket.socket() sk.connect(('127.0.0.3',9080)) urandom = sk.recv(1024) # 接收你的加密方式 hamc_obj = hmac.new(key = socket_key,msg = urandom) sk.send(hamc_obj.hexdigest().encode()) # 把你的加密结果发送 让服务端进行对比 sk.close()
我们一直以来学的TCP服务都是以一个端口一个端口进行的连接,如果你想要使用TCP协议进行多次客户端和服务端进行连接的时候, 我们可以用socketserve模块来进行多次连接
socketserver模块:
server 端 import socketserver # 并发编程 class MyServer(socketserver.BaseRequestHandler): def handle(self): self.request.send(b'hello') msg = self.recv(1024) print(msg) 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)) msg = sk.recv(1024) print(msg) sk.send(b'bye') sk.close()
socketserver是解决TCP的并发编程的