日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python网络编程3-socketserver模块

發布時間:2025/3/15 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 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服務 同一時間只能和同一個客戶通信 # socketserver tcp服務 同一時間和多個客戶通信import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self): #self.request 就相當于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 線程 一個程序只有一個線程 一個線程就是調度cpu的最小單位# 只有用線程才能占用cpuserver.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')breaksk.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')breaksk.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

總結

以上是生活随笔為你收集整理的python网络编程3-socketserver模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。