验证客户端链接的合法性:
hmac摘要模块:
server端:
import os
import socket
import hmac
def check_client(conn):
secret_key = b‘egg‘ # 密钥
send_str = os.urandom(32)
conn.send(send_str)
hmac_obj = hmac.new(secret_key,send_str)
secret_ret = hmac_obj.digest() #bytes类型
if conn.recv(1024) == secret_ret:
print(‘合法的客户端‘)
return True
else:
print(‘非法的客户端‘)
return False
sk = socket.socket()
sk.bind((‘127.0.0.1‘,8090))
sk.listen()
conn,addr = sk.accept()
ret = check_client(conn)
while ret:
inp = input(‘>>>‘)
conn.send(inp.encode(‘utf-8‘))
msg = conn.recv(1024)
print(msg.decode(‘utf-8‘))
conn.close()
sk.close()
client端:
import socket
import hmac
sk = socket.socket()
sk.connect((‘127.0.0.1‘,8090))
recv = sk.recv(1024)
# 用和server端相同的手法对这个字符串进行摘要
secret_key = b‘egg‘ # 密钥
hmac_obj = hmac.new(secret_key,recv)
ret = hmac_obj.digest()
sk.send(ret)
msg = sk.recv(1024)
if msg:
print(msg.decode(‘utf-8‘))
while True:
inp = input(‘>>>‘)
sk.send(inp.encode(‘utf-8‘))
msg = sk.recv(1024)
print(msg.decode(‘utf-8‘))
sk.close()
socketserver:
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。
ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 “线程”,该线程用来和客户端进行交互。
1、ThreadingTCPServer基础
使用ThreadingTCPServer:
- 创建一个继承自 SocketServer.BaseRequestHandler 的类
- 类中必须定义一个名称为 handle 的方法
- 启动ThreadingTCPServer