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架构。

posted @ 2020-04-07 20:33  卡奇欧  阅读(136)  评论(0)    收藏  举报