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

巴黎香榭發表於2018-08-08

原文連結

摘要: Python網路程式設計

 

 

網路的概念:主機   埠  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協議請求網頁的流程:

           建立連線、傳送請求、響應請求、斷開連結

           這樣的一個過程稱為一個事物

           

相關文章