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傳輸可靠的原因:有反饋機制,發消息之後對方必須回復確認收到消息,才會將數據從內存中清空,否則在限定的時間內會每隔一段時間發一次,直到對方接收或超時

洪水攻擊:**服務器在同一時間接收到了大量的請求

四次揮手 斷開鏈接

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