python学习笔记20
python学习笔记20
通信过程验证客户端合法性
为了防止恶意侵入服务端获取数据或传输病毒,需要对客户端的合法性进行验证,只有通过合法性验证的客户端可以和服务器进行通信传输。
为了验证客户端的合法性,在通信前服务端向客户端随机发送一个数据,客户端利用密钥和随机信息计算出一个加密结果,与服务端用相同算法计算出的结果比较。如果两个结果一致则客户端通过验证,否则断开连接。
# Server端
import socket
import os
import hashlib
# 设置密钥(只有服务端和合法的客户端内才有)
secret_key = b'Good_boy'
sk = socket.socket()
sk.bind(('127.0.0.1',9002))
sk.listen()
conn,addr = sk.accept()
# 创建随机字符串
randstr = os.urandom(32)
# 发送随机字符串
conn.send(randstr)
# 根据发送的字符串和密钥进行摘要
sha = hashlib.sha1(secret_key)
sha.update(randstr)
res = sha.hexdigest()
# 接收客户端发来的摘要
res1 = conn .recv(1024).decode('utf-8')
# 进行比对
if res == res1:
# 如果一致则说明是合法客户端,可以继续进行操作
pass
else:
# 不一致则立即关闭连接
conn.close()
sk.close()
# Client端
import socket
import hashlib
secret_key = b'Good_boy'
sk = socket.socket()
sk.connect(('127.0.0.1',9002))
# 接收随机字符串
randstr = sk.recv(32)
# 根据发送的字符串和密钥进行摘要
sha = hashlib.sha1(secret_key)
sha.update(randstr)
res = sha.hexdigest()
# 将摘要结果发回服务端
sk.send(res.encode('utf-8'))
# 继续和服务端进行通信
# ...通信代码...
sk.close()
# 上面的hashlib模块可以由hmac模块替换
# sha = hashlib.sha1(secret_key)
# sha.update(randstr)
# res = sha.hexdigest()
import os
import hmac
hmac.new(b'Good_boy',os.urandom(32))
# hmac.new(密钥,随机字符串)
socketserver
模块
socketserver
模块是基于socket
模块完成的。socket
这个底层模块一般而言封装度低,效率不固定;而高层模块像socketserver
模块一般封装度高,但是效率比较固定。
socketserver
模块可以用来处理TCP协议的server端并发的客户端请求。
# server端
import socketserver
# 父类socketserver.BaseRequestHandler里已经搭建了很多实用方法
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
while True:
try:
content = conn.recv(1024).decode('utf-8')
conn.send(content.encode('utf-8'))
except ConnectionResetError:
break
server = socketserver.ThreadingTCPServer((127.0.0.1,9003),Myserver)
server.server_forever()
# client1端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9003))
while True:
sk.send(b'hello')
content = sk.recv(1024).decode('utf-8')
print(content)
# client2端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9003))
while True:
sk.send(b'hello')
content = sk.recv(1024).decode('utf-8')
print(content)
这样就构成了一个简单的单服务器处理多客户端并发消息的C\S架构。