主頁 > 知識(shí)庫 > python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性

python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性

熱門標(biāo)簽:外呼系統(tǒng)哪些好辦 如何申請(qǐng)400電話費(fèi)用 池州外呼調(diào)研線路 武漢外呼系統(tǒng)平臺(tái) 富錦商家地圖標(biāo)注 沈陽外呼系統(tǒng)呼叫系統(tǒng) 沈陽防封電銷卡品牌 沈陽人工外呼系統(tǒng)價(jià)格 江西省地圖標(biāo)注

一、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客戶端信息,對(duì)每個(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
​
​
# 對(duì) socketserver.ThreadingTCPServer 類實(shí)例化對(duì)象,將IP地址,端口號(hào),以及自己定義的類名傳入,并返回一個(gè)對(duì)象
server = socketserver.ThreadingTCPServer(('127.0.0.1', 4444), Myserver)
server.serve_forever()      # 執(zhí)行對(duì)象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ù)端都知道的秘鑰對(duì)隨機(jī)字符串進(jìn)行加密)——>客戶端接收到服務(wù)端發(fā)送的隨機(jī)字符串(并用相同的秘鑰進(jìn)行加密發(fā)送回服務(wù)端)——>服務(wù)端接收到客戶端發(fā)送的加密字符串和自己加密的字符串做對(duì)比(如果一致,就是合法客戶端,不一致,就立即關(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)
​
# 并對(duì)字節(jié)串進(jìn)行加鹽加密
hs = hashlib.sha1(secret)
hs.update(count)
info_server = hs.hexdigest()
​
# 接收客戶端發(fā)送的對(duì)字節(jié)串加密后的信息
info_client = conn.recv(1024).decode('utf-8')
​
# 客戶端加密后的信息和服務(wù)端加密后的信息做對(duì)比
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)
​
# 對(duì)隨機(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ā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 淺談對(duì)Python變量的一些認(rèn)識(shí)理解
  • 教你利用Python破解ZIP或RAR文件密碼
  • Python協(xié)程asyncio模塊的演變及高級(jí)用法
  • Python進(jìn)階之高級(jí)用法詳細(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ù)

標(biāo)簽:銅川 黑龍江 阿里 通遼 呂梁 株洲 常德 潛江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性》,本文關(guān)鍵詞  python,基于,socketserver,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性》相關(guān)的同類信息!
  • 本頁收集關(guān)于python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章