检验客户端合法性和socketserver模块
铺垫os模块一个功能
import os print(os.urandom(4),len(os.urandom(4)))#能够生成一个括号中数字字节得bytes类型 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/包/练习.py b'\xbc\xab\xa0J' 4 Process finished with exit code 0
引入hmac模块
sever端
import socket import os import hmac secret_key=b'egg' sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() def check_conn(conn): msg=os.urandom(32) conn.send(msg) h=hmac.new(secret_key,msg) digest=h.digest() clent_digest=conn.recv(1024) return hmac.compare_digest(digest,clent_digest) conn,addr=sk.accept() res=check_conn(conn) if res: print('合法得客户端') conn.close() else: print('不合法得客户端') conn.close() sk.close()
client端
import socket import hmac secret_key=b'egg' sk=socket.socket() sk.connect(('127.0.0.1',8080)) msg=sk.recv(1024) h=hmac.new(secret_key,msg) digest=h.digest() sk.send(digest) sk.close()
socketserver模块
socket模块和tcp协议只能和一个client端口通信,但是使用socketserver模块可以实现和多个client端口进行通信。
socketserver模块是在socket模块基础上进行了进一步封装,能够实现和多个clent之间得通信。
因为server端只有一个,client端有很多,所以有socketserver但是没有socketclient
sever端
import socketserver class MySever(socketserver.BaseRequestHandler): def handle(self): print(self.request.recv(1024).decode('utf-8'))#self.request就相当于conn if __name__=='__main__': serer=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MySever)#Thread是线程的意思,一个线程就是利用CPU中的一部分空间 serer.serve_forever()
client端
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) sk.send('饿了吗'.encode('utf-8')) sk.close()
进阶:
sever端
import socketserver class MySever(socketserver.BaseRequestHandler): def handle(self): while 1: msg=self.request.recv(1024).decode('utf-8') if msg=='q': self.request.close() break print(msg) info=input('>>>:') self.request.send(info.encode('utf-8')) if __name__=='__main__': serer=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MySever)#Thread是线程的意思,一个线程就是利用CPU中的一部分空间 serer.serve_forever()
client1端
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while 1: msg=input('>>>>') if msg=='q': sk.send(b'q') break sk.send(('大众点评:'+msg).encode('utf-8')) ret=sk.recv(1024).decode('utf-8') print(ret) sk.close()
client2端
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while 1: msg=input('>>>>') if msg=='q': sk.send(b'q') break sk.send(('美团:'+msg).encode('utf-8')) ret=sk.recv(1024).decode('utf-8') print(ret) sk.close()
sever端能够同时和client1端和client2端进行通信。
这段代码没有按照预定当client发送q的时候,断开。没找出原因。