python網路編程-Json序列化功能擴展-軟體開發架構-OSI七層協議-TCP-01
- 2019 年 10 月 7 日
- 筆記
面向對象補充知識點(面向對象的應用)
擴展json序列化所支援的數據類型(分析源碼)
import json from datetime import datetime, date # -------------------------------------------------- # 時間序列化 # -------------------------------------------------- # 直接將帶有時間格式數據的字典用json序列化,報錯 # res = {'c1': datetime.today, 'c2': date.today} # 沒加括弧 # print(json.dumps(res)) # 報錯 TypeError: Object of type 'builtin_function_or_method' is not JSON serializable # res = {'c1': datetime.today(), 'c2': date.today()} # print(json.dumps(res)) # 報錯 TypeError: Object of type 'datetime' is not JSON serializable # -------------------------------------------------- # 解決方案一 # -------------------------------------------------- # 直接把時間格式的數據轉換成字元串,再json序列化 res = {'c1': str(datetime.today()), 'c2': str(date.today())} # 轉成 str print(json.dumps(res)) # {"c1": "2019-08-06 14:40:20.256285", "c2": "2019-08-06"} # -------------------------------------------------- # 解決方案二 # -------------------------------------------------- # 根據 json.JSONEncoder 源碼,給他擴展支援的數據類型 ''' To extend this to recognize other objects, subclass and implement a ``.default()`` method with another method that returns a serializable object for ``o`` if possible, otherwise it should call the superclass implementation (to raise ``TypeError``). ''' class MyJson(json.JSONEncoder): def default(self, o): if isinstance(o, datetime): return o.strftime('%Y-%m-%d %X') elif isinstance(o, date): return o.strftime("%Y-%m-%d") # ----------------------------------- # 自定義擴展其他類型 來讓json支援 # 要傳 cls=JSONEncoder 的地方應該都可以應用這個類 json.load... # ----------------------------------- # elif isinstance(o, date): # raise TypeError # 拋出異常 # elif isinstance(o, 要擴展的類型): # return o.strftime("%Y-%m-%d") # 要做的處理,確認返回方式 else: return super().default(self, o) # 調用父類的 res = {'c1': datetime.today(), 'c2': date.today()} # print(json.dumps(res)) # 報錯 TypeError: Object of type 'datetime' is not JSON serializable print(json.dumps(res, cls=MyJson)) # 將自己擴展的作為傳入參數 cls=MyJson 來支援時間類型序列化 # {"c1": "2019-08-06 14:52:08", "c2": "2019-08-06"} res2 = {'a1': datetime.today(), 'a2': date.today()} print(json.dumps(res, cls=MyJson)) # 後續要序列化含有時間類型的數據時 只需要傳入這個參數就可以了 # {"c1": "2019-08-06 20:10:56", "c2": "2019-08-06"}看看json.dumps()的源碼(按住ctrl + 滑鼠單擊dumps)

看看JSONEncoder源碼(按住ctrl + 滑鼠單擊JSONEncoder)

軟體開發架構
c/s架構(客戶端client/服務端server)
客戶端
與伺服器相對應,為客戶提供本地服務的程式
服務端
能對其它機器提供某些服務的電腦系統
b/s架構(瀏覽器端browser/服務端server)
瀏覽器也是客戶端,b/s架構本質也是c/s架構
在手機上看起來是c/s架構比較火,實際上b/s架構已經在崛起了
微信、支付寶都在統一介面(小程式平台),手機端以後肯定也是b/s比較火
- 用戶無需因為特定功能就去下載一個app(省去了手機空間與下載步驟,有些功能可能只用一次)
- 下次使用功能時也無需再去打開該軟體,不需要面對一堆應用軟體,只需要找到並打開小程式即可
其實微信、支付寶做這些苦力活也可以保住自己的流量(互聯網時代,流量十分重要)
網路編程發展史
ps:現在的大多先進的技術最早都來源於軍事
歷史上實現遠程異地通訊的方案
- 早期電話----電話
- 大屁股電腦----網線
- 早期手機----手機卡
- 筆記型電腦電腦、無線電話----網卡
要想實現遠程通訊第一個要具備的條件是:物理連接介質
不同國籍的人要想實現無障礙交流就必須說統一的語言 >>> 例如英語
電腦與電腦之間要想實現遠程通訊除了有物理連接介質之外還需要有一套:公共的協議標準
實現遠程通訊的條件
- 物理連接介質
- 公共的協議標準
- 伺服器及客戶端程式
公共的協議標準(OSI七層協議)

各層對應的物理設備

各層對應的協議

應用層
與其它電腦進行通訊的一個應用,它是對應應用程式的通訊服務的
HTTP協議、FTP協議
表示層
定義數據格式及加密
會話層
它定義了如何開始、控制和結束一個會話
傳輸層
TCP、UDP協議(都是基於埠工作的協議)
埠(port)
作用:用來唯一標識一台電腦上的某個應用程式
埠號範圍:0~65535,0~1024都是作業系統默認使用的埠號,個人程式推薦使用8000之後的埠
常見軟體的默認埠:
- mysql 默認使用 3306
- redis 默認埠 6379
- django 默認埠 8000
- flask 默認埠 5000
- tomcat 默認埠 8080
電腦上的埠號是動態分配的,將一個程式關閉之後再次啟動埠號可能就不一樣了
IP地址:可以唯一標識一台接入互聯網的電腦(獨一無二)
port埠號:可以唯一標識一台電腦上的某個應用程式
故 IP + port 可以唯一標識接入互聯網任意一台電腦上的唯一一個應用程式
電腦與電腦之間的通訊其實是電腦上的應用程式與應用程式之間的通訊
網路層
IP協議
規定了只要是接入互聯網的電腦都必須有一個IP地址
IP地址的特點:點分十進位
IP地址範圍:0.0.0.0~255.255.255.255
ipconfig可以查看本機的IP(電腦重啟會重新分配)

IP地址目前有兩個版本:IPV4、IPV6
由於IPV4已經不夠表示目前的電腦了,所以推出了IPV6版本
那麼為什麼訪問百度用的是 www.baidu.com 呢?
背後有一個「域名解析」技術,將 www.baidu.com 這個域名網址解析成了 ip 地址,然後找到了百度那台伺服器上的資源(實質上還是IP)
數據鏈路層
物理連接層的數據不知道從哪裡開始讀,一次讀幾位
數據鏈路層作的規定
- 規定了電訊號的分組方式
- 規定了任何一台接入互聯網的電腦都必須有一塊網卡 每一塊網卡上都刻有世界上獨一無二的編號(12位16進位數,前6位是廠商編號,後6位是流水線編號 ---> 這12位數是電腦的mac地址)
以上兩點合稱為「乙太網協議」
基於乙太網協議通訊的特點:通訊基本靠吼(廣播,通知所有電腦)
幾種連接方式
兩台電腦網線直連

只能實現兩台機器的鏈接(區域網),其實多一個網卡就可以與另外一個電腦相連,但那樣電腦上就太多網卡口了不好
通過交換機連接多台電腦

多台電腦之間藉助於交換機來實現互聯(區域網)
通過路由器連接多台交換機再連通多台電腦

通過路由器來跨越區域網(互聯網)
廣播:主機之間「一對所有」的通訊模式,網路對其中每一台主機發出的訊號都進行無條件複製並轉發,所有主機都可以接收到所有資訊(不管你是否需要)
單播:主機收到資訊原路返回
廣播風暴:多次廣播會造成(乙太網協議的缺點)
arp協議:根據IP地址解析mac地址
物理連接層
基於電訊號傳輸二進位數據(電腦是基於電訊號工作的,電訊號只有高低兩種電頻,用0和1表示,那表示數據也就是二進位數據)
簡記口訣
應表會傳網數物
- 應用層
- 表示層
- 會話層
- 傳輸層
- 網絡層
- 數據鏈路層
- 物理連接層
TCP協議
流式協議,可靠協議
基於TCP協議通訊,必須先建立雙向通道(前提條件)
客戶端與服務端在三次握手四次揮手中各階段的狀態

三次握手四次揮手
三次握手建立連接(雙向通道)
原理:標誌位後+1(syn = n --> ack = n + 1 請求過來n,返回n+1) 來區分客戶端

第二次與第三次握手可以合併成一次(也就是為什麼圖上有4個箭頭卻說他是三次握手)
TCP傳輸可靠的錯誤說法:TCP協議傳輸數據之所有可靠原因就在於雙向通道
TCP傳輸可靠的原因:有回饋機制,發消息之後對方必須回復確認收到消息,才會將數據從記憶體中清空,否則在限定的時間內會每隔一段時間發一次,直到對方接收或超時
洪水攻擊:**伺服器在同一時間接收到了大量的請求
四次揮手 斷開鏈接

因為第二次揮手與第三次揮手之間服務端還需要檢測,做處理,故不能合併為一次揮手