一,验证客户端链接的合法性
如果想在分布式系统中实现一个简单的客户端链接认证功能,可以利用hmac实现。
import socket import hmac import os secret_key=‘中国‘.encode(‘utf-8‘) #设置密钥 sk=socket.socket() sk.bind((‘127.0.0.1‘,8090)) sk.listen() def chack_conn(conn): msg=os.urandom(32) #随机生成32个字节的bytes类型 conn.send(msg) h=hmac.new(secret_key,msg) digest=h.digest() client_digest=conn.recv(1024) return hmac.compare_digest(digest,client_digest) #比较密文一致性 conn,addr=sk.accept() res=chack_conn(conn) if res: print(‘合法‘) conn.close() else: print(‘不合法‘) conn.close() sk.close()
import hmac import socket secret_key=‘fgdf‘.encode(‘utf-8‘) sk=socket.socket() sk.connect((‘127.0.0.1‘,9090)) msg=sk.recv(1024) h=hmac.new(secret_key,msg) digest=h.digest() sk.send(digest) sk.close()
二,socketserver(实现和多个客户端链接交互)
import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): while True: #print(self.client_address) #获取IP地址和端口 msg=self.request.recv(1024).decode(‘utf-8‘) if msg==‘q‘:break print(msg) info=input(‘%s‘%msg[0:2]+ ‘>>>‘) self.request.send((‘爷爷 :‘+info).encode(‘utf-8‘)) if __name__==‘__main__‘: server=socketserver.ThreadingTCPServer((‘127.0.0.1‘,8090),MyServer) # server.allow_reuse_address=True #端口重用 server.serve_forever() #地址(端口)重用可以多个socket绑定一个地址。 # 比如程序中有两个socket都要从某个地址的同一个端口接收数据。 # 一般情况下,绑定第一个socket后,第二个socket会绑定失败。 # 这时可以利用地址重用,在绑定端口之前调用。
#写法不变 import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,8090)) while 1: info_cli=input(‘>>>‘) if info_cli==‘q‘: sk.send(b‘q‘) break sk.send((‘二娃 :‘+info_cli).encode(‘utf-8‘)) d=sk.recv(1024).decode(‘utf-8‘) print(d)
客户端2
import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,8090)) while True: msg=input(">>>") if msg==‘q‘: sk.send(b‘q‘) break sk.send((‘大娃 :‘+msg).encode(‘utf-8‘)) see=sk.recv(1024).decode(‘utf-8‘) print(see)