Python網路程式設計(socket模組、緩衝區、http協議)

巴黎香榭發表於2018-08-08
網路的概念:主機   埠  IP  協議
  •           伺服器:
  •       localhost/127.0.0.1
  •   客戶端:
  •       只是在本機啟動客戶端,用127.0.0.1訪問
  •   伺服器:
  •       0.0.0.0
  •   客戶端:
  •       可以在本機用127.0.0.1、192.168.0.1
  •   伺服器:
  •       192.168.0.1
  •   客戶端:
  •       區域網內用192.168.0.1
socket(建立套接字) —> bind(繫結地址) —> listen(設定監聽)—> accept(等待連結) —> recv/send(收/發訊息) —> close ()
收發函式特性:
     recv特徵:
  1. 如果建立的另一端連結被斷開, 則recv立即返回空字串
  2. recv接受緩衝區取出內容,當緩衝區為空則阻塞
  3. recv如果一次接受不完緩衝區的內容下次執行會自動接受
     send特徵:
  1.         如果傳送的另一端不存在則會產生Pipe Broken異常
  2. send傳送緩衝區傳送內容,緩衝為滿則堵塞
網路的收發快取區:
    在記憶體中開闢區域,用於傳送和接受的緩衝
    作用:
  1.         協調資料的收發(接受和處理速度
  2.         減少磁碟的互動
sendall(date):
   功能:tcp套接字傳送訊息
   引數:同send
   返回值:如果傳送成功返回None   否則返回異常
tcp粘包:
   產生原因:
        1.tcp傳輸以位元組流的方式傳送訊息,訊息之間沒有邊界
2.傳送比接受的速度快
   影響:
        對每次傳送的內容是一個獨立的意識需要單獨識別時 容易使用原檔案被更改
   如何處理:
        1.每次傳送後追加一個結尾標誌,代表本次傳送完畢
2.傳送一個資料結構
3.每次傳送有一個時間間隔
基於udp的服務端程式設計:
    1.建立套接字:
        sockfd = socket(AF_INET,SOCK_DGRAM)
    2.繫結地址:
        sockfd.bind()
    3.訊息收發
        data, addr = sockfd.recvfrom(buffersize)
         功能:接受udp訊息
引數:接受訊息的大小
返回值:
     data 接受到的內容
     addr 訊息傳送的地址
        
recvfrom每次接受一個報文,如果沒有接受到的內容則直接丟棄
        sockfd.sendto(data, addr)
  功能:udp訊息傳送
  引數:
      data 要傳送的內容 bytes
      addr 目標地址
  返回:傳送位元組數
    4.關閉套接字:
        socket.close()
import sys
   sys.argv
   作用:
      獲取從命令列獲取的引數內容
      Python3 demo.py 引數1, 引數2…..
      sys.argv[0] 是命令本身(程式本身)
tcp流式套接字和udp資料包套接字區別:
  •     1.流式套接字採用位元組流的方式進行傳輸,
  •        而資料包套接字使用資料包形式傳輸資料
  •     2.tcp套接字會產生粘包,udp不會
  •     3.tcp程式設計可以保證訊息的完整性,udp則不一定
  •     4.tcp需要listen、accept、udp不用
  •     5.tcp訊息的傳送接收使用recv、send、sendall、
  •        udp使用recvfrom,sendto
socket模組套接字屬性(s為套接字)
  •   s.type:表示套接字型別
  •   s.family地址型別
  套接字屬性方法
    s.fileno()
    功能:
       獲取套接字的檔案描述符
  檔案描述符:
     每一個IO事件 作業系統都會分配一個不同的的正整數,
     該正整數即為此IO操作的檔案描述符
     預設開啟的描述符:
  1.          sys.stdin      0
  2.          sys.stdout   1
  3.          sys.stderr    2
  s.getsockname()
     功能:
       獲取套結字繫結的地址
  s.getpeername()
     功能:
       獲取連結套接字客戶端的地址
  s.setsockopt(level,optname, value)
       (# 設定埠可立即重用 必須在連結埠前設定
        s.setsockopt(SOL_SOcKET, SO_REUSEADDR))
     功能:設定套接字選項
     引數:
        level:設定選項的型別(大型別)  常用:SOL_SOCKET
optname:子類選項
value:要設定的值
  s.getsockoptlevel, optname)
     功能:獲取套接字選項值
     引數:
        level:選項的型別
udp套接字應用—>  廣播
    一點傳送多點接收
    目標地址:廣播地址 172.18.32.255
tcp應用—> http傳輸
http協議:
   超文字傳輸協議
   用途:
      網站中瀏覽器網頁的獲取,基於網站事物資料傳輸
      編寫基於http協議的資料傳輸
   特點:
      1.應用層協議,傳輸層使用tcp服務
      2.簡單、靈活,可以使用多種程式語言操作
      3.無狀態的協議,既不用記錄使用者的輸入內容
      4.http1.1  —> http2.0(還沒釋出)  技術的成熟和穩定性
   http請求(request):
      請求格式:
         1.請求行:說明具體的請求類別和內容
          GET    /index.html    /HTTP/1.1
                請求類別   請求內容    協議版本
     請求類別:
      1. GET:              獲取網路資源
      2. POST:           提交一定的附加資料
      3. HEAD:          獲取響應頭
      4. PUT:             更新伺服器資源
      5. DELETE:        刪除伺服器資源
      6. CONNECT:   未使用
      7. TRACE:         用於測試
      8. OPTIONS:    獲取伺服器效能資訊
 2.請求頭:請求的具體描述
     Accept:text/html
        每一個鍵值對佔一行,描述了一個特定資訊
 3.空行
 4.請求體: 具體引數或提交的內容
    get引數或者post提交的內容
   http響應(response):
      響應格式:
         1.響應行:反饋具體的響應情況
          HTTP/1.1     20       OK
  版本協議   響應碼   附加資訊
    響應碼:
    1.        1xx:提示資訊,表示請求已接收
    2.        2xx:響應成功
    3.        3xx:響應需要定向(重新記載連結第三方連結)
    4.        4xx:客戶端錯誤
    5.        5xx:伺服器端錯誤
    常見響應碼:
     200  成功
     404  請求內容不存在
     401  沒有訪問許可權
     500  伺服器未知錯誤
     503  伺服器暫時無法執行
      2.響應頭:對響應內容的具體描述
      3.空行
      4.響應體:
         將客戶端請求內容進行返回



這裡這個圖就看了一眼 沒特意去記  憑印象畫的  可能不對 但是大體邏輯應該沒錯 
我去百度搜了 什麼也沒搜到 不知道是不是我的開啟方式不對還是什麼
只搜到了上面的兩張圖……….
總結:
tcp,udp協議的區別和程式設計實現上的差異:
          tcp:
  •                tcp是一種可靠的、面向有連結資料傳輸服務
  •                tcp能夠保證資料的完整性、順序性、無重複以及無差錯
  •                tcp是一種以檔案流的形式傳輸資料的服務 檔案流之間是沒有邊界
  •                的所以基友可能會產生粘包的情況 粘包是因為接受速度沒有傳輸速度快
  •                導致快取區的資料擁堵 下次取出資料時從而產生非獨立資料的連結 這種情況
  •                叫做粘包  粘包只有傳輸多個資料時才會出現
  •                tcp的程式設計需要監聽套接字 和 等待連結過程 只有連結成功才能傳送資料
  •                這種情況叫做三次握手、還有斷開時的四次揮手
  •                三次揮手:客戶端請求連結、伺服器返回報文、客戶端完成連結
  •                四次揮手:客戶端請求斷開、伺服器接受請求、伺服器準備完畢可以斷開、客戶端斷開
  •                tcp收傳送訊息需要使用recv、send、sendall方法
  •                sendall位元殊 功能和send一樣 但sendall有事務  若傳送成功返回None 否則觸發異常
  •               連結時必須先執行伺服器端後執行客戶端
         udp:
  •              udp就比較簡單了  是面向無連線的不可靠的資料傳輸服務
  •              udp沒有資料流  接受大小取決於接收方
  •              若資料超出接收方接受範圍則丟掉所有超出範圍的內容
  •              udp不存在粘包的情況
  •              udp不需要等待連結 沒有揮手過程 先發就發 想收就收 自由度比較高
  •              udp程式設計時收發訊息使用recvfrom、sendto方法
  •              udp可用於廣播可以隨時斷開或連結
  •              客戶端和伺服器端可以隨時執行
 
什麼是http?
       http 是超文字傳輸協議
               一種網路資料傳輸的協議
              沒錯就是  協議
             並且所有的www檔案都必須遵守這個標準
http作用是什麼?
      可以用力來網站中瀏覽器網頁獲取,基於網站上的一些資料傳輸 例如目前我正在打的字……
      編寫基於http協議的資料傳輸  
http協議 請求和響應的格式以及每一部分做什麼
      請求部分:
               請求行:請求的具體類別和內容   比如說  類別、內容、版本協議
               請求頭:請求具體描述
               空行:就是空行
               請求體:請求具體引數或內容
      響應部分:
               響應行:具體響應情況     比如說  版本協議 、響應碼 、附加資訊  
               響應頭:響應具體描述
               空行
               響應體:響應具體引數或內容
http協議中請求的基本型別和作用:
        GET:獲取網路資源
        POST:提交一定的附加資料
        HEAD:獲取響應頭 響應返回的檔案資訊
        PUT:更新伺服器資源
        DELETE:刪除伺服器資源
        TRACE:用於測試
         OPIONS:獲取伺服器效能資訊
        CONNECT:備用
http協議響應碼的型別和表達含義:
          以1開頭的表示請求已經連結
          以2開頭的表示成功接收、提示
          以3開頭的代表重新定向進一步處理 第三方
          以4開頭的客戶端錯誤
          以5開頭的伺服器錯誤
http協議請求網頁的流程:
           建立連線、傳送請求、響應請求、斷開連結
           這樣的一個過程稱為一個事物
           


相關文章