目錄
- 一、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實現并發的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- 淺談對Python變量的一些認識理解
- 教你利用Python破解ZIP或RAR文件密碼
- Python協程asyncio模塊的演變及高級用法
- Python進階之高級用法詳細總結
- python3 如何使用 goto 跳轉執行到指定代碼行
- 如何用python抓取B站數據
- python print()函數的end參數和sep參數的用法說明
- python實現某考試系統生成word試卷
- 解讀python基于netconf協議獲取網元的數據