python基於socketserver實現並發,驗證客戶端的合法性
一、socketserver實現並發
tcp協議的socket是隻能和一個客戶端通信的,使用socketserver可以實現和多個客戶端通信,他是在socket的基礎上進行的封裝,底層還是調用的socket。
socket是底層模塊
socketserver是基於socket完成的
socketserver代碼格式:
服務端:
import socketserver # 引入模塊 import time # 類名隨便定義,但是必須繼承socketserver.BaseRequestHandler此類。 class Myserver(socketserver.BaseRequestHandler): def handle(self): # handle方法,固定名字 conn = self.request # conn相當於每個客戶端連接過來的,客戶端信息 ''' 以下就是基於conn客戶端信息,對每個客戶端鏈接到服務端必須做的操作 conn——>等於客戶端的連接信息 以此實現並發連接 ''' while True: try: content = conn.recv(1024).decode('utf-8') conn.send(content.upper().encode('utf-8')) time.sleep(1) except ConnectionResetError: break # 對 socketserver.ThreadingTCPServer 類實例化對象,將IP地址,端口號,以及自己定義的類名傳入,並返回一個對象 server = socketserver.ThreadingTCPServer(('127.0.0.1', 4444), Myserver) server.serve_forever() # 執行對象server_forever方法,開啟服務端
客戶端:
import socket sk = socket.socket() sk.connect(('127.0.0.1', 4444)) while True: sk.send(b'heelo') content = sk.recv(1024).decode('utf-8') print(content)
二、驗證客戶端合法性
在分佈式系統中實現一個簡單的客戶端鏈接認證功能,又不像SSL那麼復雜,那麼利用hmac+加鹽的方法實現。
思路:
服務端發送隨機字符串(並用客戶端和服務端都知道的秘鑰對隨機字符串進行加密)——>客戶端接收到服務端發送的隨機字符串(並用相同的秘鑰進行加密發送回服務端)——>服務端接收到客戶端發送的加密字符串和自己加密的字符串做對比(如果一致,就是合法客戶端,不一致,就立即關閉)
使用hashlib方法:
服務端
import socket import hashlib import os # 設置雙方都擁有的秘鑰 secret = '秘鑰'.encode('utf-8') sk = socket.socket() sk.bind(('127.0.0.1', 4444)) sk.listen() conn, _ = sk.accept() # 給服務端發送32位隨機字節串 count = os.urandom(32) conn.send(count) # 並對字節串進行加鹽加密 hs = hashlib.sha1(secret) hs.update(count) info_server = hs.hexdigest() # 接收客戶端發送的對字節串加密後的信息 info_client = conn.recv(1024).decode('utf-8') # 客戶端加密後的信息和服務端加密後的信息做對比 if info_server == info_client: # 相等則連接合法,繼續操作 print('合法連接') else: # 不相等則斷開鏈接 print('非合法用戶') conn.close()
客戶端
import socket import hashlib # 雙方共有的秘鑰 secret = '秘鑰'.encode('utf-8') sk = socket.socket() sk.connect(('127.0.0.1', 4444)) # 接收服務端發送的隨機字節 count = sk.recv(1024) # 對隨機字節進行加密 hs = hashlib.sha1(secret) hs.update(count) info = hs.hexdigest().encode('utf-8') # 把加密後的字節發送回服務端做判斷 sk.send(info)
以上就是python基於socketserver實現並發,驗證客戶端的合法性的詳細內容,更多關於python socketserver實現並發的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python網絡編程之socket與socketserver
- python利用socket實現客戶端和服務端之間進行通信
- python socket多線程實現客戶端與服務器連接
- Python中的socket網絡模塊介紹
- 詳解python的網絡編程基礎