1. 程式人生 > >python網路程式設計3-socketserver模組

python網路程式設計3-socketserver模組

一、複習

# 解決黏包問題
#為什麼會出現黏包問題
    # 首先只有在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