python网络编程3-socketserver模块
生活随笔
收集整理的這篇文章主要介紹了
python网络编程3-socketserver模块
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、復(fù)習(xí)
# 解決黏包問(wèn)題 #為什么會(huì)出現(xiàn)黏包問(wèn)題# 首先只有在TCP協(xié)議中才會(huì)出現(xiàn)黏包現(xiàn)象# 是因?yàn)門CP協(xié)議是面向流的協(xié)議# 在發(fā)送的數(shù)據(jù)傳輸過(guò)程中有緩存機(jī)制來(lái)避免數(shù)據(jù)丟失# 因此在連續(xù)發(fā)送小數(shù)據(jù)的時(shí)候,以及接收大小不符的時(shí)候都容易出現(xiàn)尿包現(xiàn)象# 本質(zhì)還是因?yàn)槲覀冊(cè)诮邮諗?shù)據(jù)時(shí)不清楚發(fā)送數(shù)據(jù)的長(zhǎng)短 # 解決黏包問(wèn)題# 在傳輸大量數(shù)據(jù)之前先告訴接收端要發(fā)送的數(shù)據(jù)大小# 或者通過(guò)struct模塊來(lái)定制協(xié)議 # struct模塊#pack unpack# 模式‘i’# pack后的長(zhǎng)度:4個(gè)字節(jié)# unpack后的數(shù)據(jù)是元組:元組的第一個(gè)元素才是pack的值二、hmac加密問(wèn)題
import hmac h=hmac.new() # secrect_key,你想進(jìn)行加密的bytes h.digest() #密文的內(nèi)容 hmac.compare_digest() #對(duì)比 密文 另外一個(gè)密文?例 驗(yàn)證客戶端的合法性
server:
import socket import os import hmac # os.urandom(32) # 隨機(jī)生成32位字節(jié) def check_conn(conn):msg=os.urandom(32) # 隨機(jī)一段內(nèi)容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 hmacsecret_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服務(wù) 同一時(shí)間只能和同一個(gè)客戶通信 # socketserver tcp服務(wù) 同一時(shí)間和多個(gè)客戶通信import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self): #self.request 就相當(dāng)于connwhile True:msg=self.request.recv(1024).decode('utf-8')if msg=='q':breakprint(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 線程 一個(gè)程序只有一個(gè)線程 一個(gè)線程就是調(diào)度cpu的最小單位# 只有用線程才能占用cpuserver.serve_forever()# bind、listen # conn,addr=accept # self.request=conn # socket_server #看源碼方法: # 第一 多個(gè)類之間的繼承關(guān)系要先整理 # 每一個(gè)類中的方法,要大致列出來(lái) # 所有的self對(duì)象調(diào)用要清楚的了解 到底是誰(shuí)的對(duì)象 # 所有的方法調(diào)用要退回到最子類的類中開始尋找,逐級(jí)查看client1:
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True:msg=input('>>>')if msg=='q':sk.send(b'q')breaksk.send(('大眾點(diǎn)評(píng):'+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')breaksk.send(('美團(tuán):' + msg).encode('utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret) sk.close()運(yùn)行結(jié)果:
?
?參考自https://www.cnblogs.com/Eva-J/articles/8244551.html#_label5
總結(jié)
以上是生活随笔為你收集整理的python网络编程3-socketserver模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: notepad多行编辑_Windows
- 下一篇: python各进制的表述与转换