python網路程式設計3-socketserver模組
阿新 • • 發佈:2018-12-10
一、複習
# 解決黏包問題 #為什麼會出現黏包問題 # 首先只有在TCP協議中才會出現黏包現象 # 是因為TCP協議是面向流的協議 # 在傳送的資料傳輸過程中有快取機制來避免資料丟失 # 因此在連續傳送小資料的時候,以及接收大小不符的時候都容易出現尿包現象 # 本質還是因為我們在接收資料時不清楚傳送資料的長短 # 解決黏包問題 # 在傳輸大量資料之前先告訴接收端要傳送的資料大小 # 或者通過struct模組來定製協議 # struct模組 #pack unpack # 模式‘i’ # pack後的長度:4個位元組 # unpack後的資料是元組:元組的第一個元素才是pack的值
二、hmac加密問題
import hmac h=hmac.new() # secrect_key,你想進行加密的bytes h.digest() #密文的內容 hmac.compare_digest() #對比 密文 另外一個密文
例 驗證客戶端的合法性
server:
import socket import os import hmac # os.urandom(32) # 隨機生成32位位元組 def check_conn(conn): msg=os.urandom(32) # 隨機一段內容 conn.send(msg) h=hmac.new(secrect_key,msg) digest=h.digest() client_digest=conn.recv(1024) return hmac.compare_digest(digest,client_digest) secrect_key=b'egg' sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr=sk.accept() res=check_conn(conn) if res: print('合法客戶端') conn.close() else: print('不合法客戶端') conn.close() sk.close()
client:
import socket
import hmac
secret_key=b'egg'
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
msg=sk.recv(1024)
h=hmac.new(secret_key,msg)
digest=h.digest()
sk.send(digest)
三、socketserver模組
server:
# socket tcp服務 同一時間只能和同一個客戶通訊 # socketserver tcp服務 同一時間和多個客戶通訊 import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): #self.request 就相當於conn while True: msg=self.request.recv(1024).decode('utf-8') if msg=='q': break print(msg) info=input('%s>>>'%msg[:2]) self.request.send(info.encode('utf-8')) if __name__ =='__main__': server=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer) # thread 執行緒 一個程式只有一個執行緒 一個執行緒就是排程cpu的最小單位 # 只有用執行緒才能佔用cpu server.serve_forever() # bind、listen # conn,addr=accept # self.request=conn # socket_server #看原始碼方法: # 第一 多個類之間的繼承關係要先整理 # 每一個類中的方法,要大致列出來 # 所有的self物件呼叫要清楚的瞭解 到底是誰的物件 # 所有的方法呼叫要退回到最子類的類中開始尋找,逐級檢視
client1:
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg=input('>>>')
if msg=='q':
sk.send(b'q')
break
sk.send(('大眾點評:'+msg).encode('utf-8'))
ret=sk.recv(1024).decode('utf-8')
print(ret)
sk.close()
client2:
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg=input('>>>')
if msg=='q':
sk.send(b'q')
break
sk.send(('美團:' + msg).encode('utf-8'))
ret=sk.recv(1024).decode('utf-8')
print(ret)
sk.close()
執行結果:
參考自https://www.cnblogs.com/Eva-J/articles/8244551.html#_label5