网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接

我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗?  那不可能的  你肯定要进行限定的 

验证客户端链接的合法性:

hamc模块

hamc也是一个加密的模块

但是只能对字节进行加密

import hmac
s = '老王'.encode('UTF-8') n = hmac.new(key = s) print(n.hexdigest()) # 6afd402b51938e21ee2ace13ddf0ead1

它的加密的后面还可以选择加密的情况 但是只能对字节

import hmac
import os
t = os.urandom(30)  # os.urandom 是随机获取字节数
s = '老王'.encode('UTF-8')
n = hmac.new(key = s,msg= t)  # 只对30个字节进行加密
print(n.hexdigest())  # 909271871e55dc492febe63fea8776dd

这个时候我们就用到了一个类似于之前的hashlib模块的加密了hamc模块,hmac模块是专门用来判断合法性的

server端口

import os
import hmac
import socket
soctet_key = '老王在隔壁'.encode('UTF-8')
sk = socket.socket()
sk.bind(('127.0.0.3',9080))
sk.listen()
while True:
    while True:
        try:

            conn,addr = sk.accept()
            random_bytes = os.urandom(30)  # 随机获取一段字节  os模块的os.uurandom是专门随机获取字节的
            conn.send(random_bytes)  # 先把你的加密方式发送过去
            obj = hmac.new(key = socket_key,smg = random_bytes )  # 这是运用hmac对你的信息进行加密 前面的是内容后面是加密的方式
            ret = obj.hecdigest()
            msg = conn.recv(1024).decode('UTF-8')
            if msg == ret :print('是合法的')
            else:conn.close()

        finally:
           sk.close()
           break




client端口:




import socket
import hmac
socket_key = '老王在隔壁'.encode('UTF-8')
sk = socket.socket()
sk.connect(('127.0.0.3',9080))
urandom = sk.recv(1024)  # 接收你的加密方式
hamc_obj = hmac.new(key = socket_key,msg = urandom)
sk.send(hamc_obj.hexdigest().encode()) # 把你的加密结果发送 让服务端进行对比
sk.close()
View Code

我们一直以来学的TCP服务都是以一个端口一个端口进行的连接,如果你想要使用TCP协议进行多次客户端和服务端进行连接的时候, 我们可以用socketserve模块来进行多次连接

socketserver模块:

server 端

import socketserver
# 并发编程
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        self.request.send(b'hello')
        msg = self.recv(1024)
        print(msg)

if __name__ == '__main__':
    socketserver.TCPServer.allow_reuse_address = True
    server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),MyServer)
    server.serve_forever()



client端


import socket
sk  = socket.socket()
sk.connect(('127.0.0.1',9000))
msg = sk.recv(1024)
print(msg)
sk.send(b'bye')
sk.close()
View Code

 socketserver是解决TCP的并发编程的

原文地址:https://www.cnblogs.com/zhaoyunlong/p/9012304.html