python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性
一、socketserver實(shí)現(xiàn)并發(fā)
tcp協(xié)議的socket是只能和一個(gè)客戶端通信的,使用socketserver可以實(shí)現(xiàn)和多個(gè)客戶端通信,他是在socket的基礎(chǔ)上進(jìn)行的封裝,底層還是調(diào)用的socket。
socket是底層模塊
socketserver是基于socket完成的
socketserver代碼格式:
服務(wù)端:
import socketserver # 引入模塊 import time # 類名隨便定義,但是必須繼承socketserver.BaseRequestHandler此類。 class Myserver(socketserver.BaseRequestHandler): def handle(self): # handle方法,固定名字 conn = self.request # conn相當(dāng)于每個(gè)客戶端連接過來的,客戶端信息 ''' 以下就是基于conn客戶端信息,對每個(gè)客戶端鏈接到服務(wù)端必須做的操作 conn——>等于客戶端的連接信息 以此實(shí)現(xiàn)并發(fā)連接 ''' 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 類實(shí)例化對象,將IP地址,端口號,以及自己定義的類名傳入,并返回一個(gè)對象 server = socketserver.ThreadingTCPServer(('127.0.0.1', 4444), Myserver) server.serve_forever() # 執(zhí)行對象server_forever方法,開啟服務(wù)端
客戶端:
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)
二、驗(yàn)證客戶端合法性
在分布式系統(tǒng)中實(shí)現(xiàn)一個(gè)簡單的客戶端鏈接認(rèn)證功能,又不像SSL那么復(fù)雜,那么利用hmac+加鹽的方法實(shí)現(xiàn)。
思路:
服務(wù)端發(fā)送隨機(jī)字符串(并用客戶端和服務(wù)端都知道的秘鑰對隨機(jī)字符串進(jìn)行加密)——>客戶端接收到服務(wù)端發(fā)送的隨機(jī)字符串(并用相同的秘鑰進(jìn)行加密發(fā)送回服務(wù)端)——>服務(wù)端接收到客戶端發(fā)送的加密字符串和自己加密的字符串做對比(如果一致,就是合法客戶端,不一致,就立即關(guān)閉)
使用hashlib方法:
服務(wù)端
import socket import hashlib import os # 設(shè)置雙方都擁有的秘鑰 secret = '秘鑰'.encode('utf-8') sk = socket.socket() sk.bind(('127.0.0.1', 4444)) sk.listen() conn, _ = sk.accept() # 給服務(wù)端發(fā)送32位隨機(jī)字節(jié)串 count = os.urandom(32) conn.send(count) # 并對字節(jié)串進(jìn)行加鹽加密 hs = hashlib.sha1(secret) hs.update(count) info_server = hs.hexdigest() # 接收客戶端發(fā)送的對字節(jié)串加密后的信息 info_client = conn.recv(1024).decode('utf-8') # 客戶端加密后的信息和服務(wù)端加密后的信息做對比 if info_server == info_client: # 相等則連接合法,繼續(xù)操作 print('合法連接') else: # 不相等則斷開鏈接 print('非合法用戶') conn.close()
客戶端
import socket import hashlib # 雙方共有的秘鑰 secret = '秘鑰'.encode('utf-8') sk = socket.socket() sk.connect(('127.0.0.1', 4444)) # 接收服務(wù)端發(fā)送的隨機(jī)字節(jié) count = sk.recv(1024) # 對隨機(jī)字節(jié)進(jìn)行加密 hs = hashlib.sha1(secret) hs.update(count) info = hs.hexdigest().encode('utf-8') # 把加密后的字節(jié)發(fā)送回服務(wù)端做判斷 sk.send(info)
以上就是python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性的詳細(xì)內(nèi)容,更多關(guān)于python socketserver實(shí)現(xiàn)并發(fā)的資料請關(guān)注腳本之家其它相關(guān)文章!
- 淺談對Python變量的一些認(rèn)識理解
- 教你利用Python破解ZIP或RAR文件密碼
- Python協(xié)程asyncio模塊的演變及高級用法
- Python進(jìn)階之高級用法詳細(xì)總結(jié)
- python3 如何使用 goto 跳轉(zhuǎn)執(zhí)行到指定代碼行
- 如何用python抓取B站數(shù)據(jù)
- python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說明
- python實(shí)現(xiàn)某考試系統(tǒng)生成word試卷
- 解讀python基于netconf協(xié)議獲取網(wǎng)元的數(shù)據(jù)
相關(guān)文章
Python實(shí)現(xiàn)PS濾鏡Fish lens圖像扭曲效果示例
這篇文章主要介紹了Python實(shí)現(xiàn)PS濾鏡Fish lens圖像扭曲效果,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)PS濾鏡的圖像扭曲效果相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Python?flask?sqlalchemy的簡單使用及常用操作
這篇文章主要介紹了Python?flask?sqlalchemy的簡單使用及常用操作,在python中,常用的ORM工具就是sqlalchemy了。下面就以一個(gè)簡單的flask例子來說明吧,需要的小伙伴可以參考一下2022-08-08Tkinter組件實(shí)現(xiàn)Radiobutton的示例
Radiobutton組件用于實(shí)現(xiàn)多選一的問題,本文主要介紹了Tkinter組件實(shí)現(xiàn)Radiobutton的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Pytorch實(shí)現(xiàn)的手寫數(shù)字mnist識別功能完整示例
這篇文章主要介紹了Pytorch實(shí)現(xiàn)的手寫數(shù)字mnist識別功能,結(jié)合完整實(shí)例形式分析了Pytorch模塊手寫字識別具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12windows下安裝Python的XlsxWriter模塊方法
今天小編就為大家分享一篇windows下安裝Python的XlsxWriter模塊方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05深度學(xué)習(xí)TextRNN的tensorflow1.14實(shí)現(xiàn)示例
這篇文章主要介紹了深度學(xué)習(xí)TextRNN的tensorflow1.14實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01