天天看點

Python網絡程式設計(weekly summary1)

網絡的目的是什麼?

    用于資訊傳輸、接受  能把各個點、面、體的資訊連結到一起 實作資源的共享

OSI模型:

    應用層:提供程式服務

    表示層:資料加密、優化、壓縮

    會話層:建立連結、傳輸服務

    傳輸層:提供資料傳輸服務

    網絡層:路由選擇 網路互聯

    連表層:連結交換

    實體層:硬體、接口、網卡規定等

    特點:

       将功能分開來達到高内聚低耦合

       讓開發更為清晰

什麼是網絡協定?

    是為了完成計算機網絡通訊而制定的規則、約定、标準

各模型使用的協定:

    應用層:TFTP(檔案傳輸)、HTTP(超文本傳輸協定)、DNS(域名解析)、SMTP(郵件傳輸)

    傳輸層:TCP(面向有連結的可靠的傳輸服務)、UDP(面向無連接配接的不可的傳輸靠服務)

    網絡層:IP(IP位址)常用IPV4:點分十進制   取值0~256之間(32位)  IPV6::128位

    實體層:IEEE

特殊IP:

   127.0.0.1      本機IP

   0.0.0.0        自動使用本地可用網卡IP

   192.168.1.0    代表網段

   192.168.1.1    通常為網關位址

   192.198.1.255  廣播位址

端口:

  取值範圍1~65535之間

  1~255      一些通用端口

  256~1023   系統端口

  1024~65535 自用端口

Linux指令:

     ifconfig   檢視本機IP

     ping IP    檢視延遲

     ps -aux    檢視系統程序資訊

     chmod      設定檔案權限

     nice -9 ./hello.py  以9的優先級運作

     pstree     檢視程序樹

     ps -ajx    檢視父子程序ID

Linux下檔案類型:

      bcd -lsp

         b(快  裝置檔案)

         c(字元裝置檔案)

         d(目錄)

         -(普通檔案)

         l(連結檔案)

         s(套接字檔案)

         p(管道檔案) 

ps -aux   查詢結果的 STAT表示程序狀态:

    D  等待态  阻塞  不可中斷等待态

    S  等待态  睡眠  可中斷等待态

    T  等待态  暫停  暫停執行

    R  運作态(就緒态)

    Z  僵屍

      +  前台程序(在終端運作)

      <  有較高優先級的程序

      N  較低優先級的程序

       s  回話組

       l  有子程序連結

    程序優先級:

        取值範圍:-20~19   -20最高

Python socket子產品

     socket.gethostname()  擷取本機名

     socket.gethostbyname("主機名")   利用主機名擷取IP

     soccket.gethostbtname(“IP”)  擷取本地IP

IP的十六進制轉換:

    socket.inet_aton(IP)       十進制轉十六進制

    socket.inet_atoa(十六進制) 十六進制轉十進制

    socket.gethostbyaddr('127.0.0.1')

      傳回值:元組(主機, 别名,ip位址)

    socket.getservbyname("程式名")   擷取程式端口

套接字:是通過程式設計語言提供的套接字程式設計借口

傳輸層服務:

    tcp:(SOCK_STREAM)

      面向有連結的可靠的傳輸服務   流式套接字

      1.建立套接字:

             socket = socket.socket()

      2.綁定位址:

             socket.bind

      3.設定監聽:

             socket.listen()

      4.等待用戶端連結:

            socket.accept()

      5.消息收發:

            socket.recv(4096)

            socket.send(“”)

      6.關閉套接字:

            socket.close()

      用戶端:

         1.建立套接字

            socket.socket.socket()

         2.發起連結

               socket.connect(位址)

         3.消息收發

               socket.recv(1024)  收消息

               socket.send("")    發消息

               socket.sendall():

                   事物發消息 成功傳回None 失敗異常

         4.關閉套接字

                socket.close()

      recv特性:

           建立連結的另一端被斷開,會傳回一個空字元串  從緩沖區取内容

      send特性:

           另一端不純在産生一個pipe Broken 異常  向緩沖區寫内容

      緩沖區:

           減少和和磁盤互動協調資料收發  提高效率

      粘包:

           由于tcp是資料流套接字的原因每次發送的資料間

           沒有邊界一次取不完下次取資料時會形成粘包

    udp:(SOCK_DGRAM)

      面向無連接配接的不可靠的傳輸服務 資料報套接字

            socket = socket.socket(AF_INET,SOCK_DGRAM)

            socket.bind()

      3.收發消息:

            socket.recvfrom()

            socket.sento()

      4.關閉套接字:

          1.建立套接字:

            socket = socket.socket()

          2.收發消息;

            socket.recvform()

            socket.sendto(“”, 位址)

          3.關閉套接字:

            socket.close()

sys.argv() 指令行擷取參數

傳回值:

    元組:sys.argv[0] 開始  空格隔開 引号隔開

套接字屬性方法:

     套接字的屬性:

            socket.type

     位址類型:

            socket.family

     套接字IO描述符:

            socket.fileno()

            系統IO描述符:

               sys.stdin = 0

               sys.stdout = 1

               sys.stderr = 2

     擷取套接字位址:

             socket.getsockname()

     擷取套接字用戶端位址:

             socket.getpeername()

     設定端口重用:

             socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

     擷取套接字選項值:

             socket.getsockopt()

     設定為非阻塞狀态:

             socket.setblocking(False)

     逾時檢測:

             socket.settimeout(sec)

HTTP協定(超文本傳輸協定):

     網站浏覽器擷取網頁的一種協定

     并且所有的www.檔案都必須遵守這個标準

HTTP請求:

      1.請求行:

            說明具體的請求類别和内容

           GET        /index.html    /HTTP/1.1

         請求類别      請求内容       協定版本

      請求類别:

         GET:              擷取網絡資源

         POST:           送出一定的附加資料

         HEAD:          擷取響應頭

         PUT:             更新伺服器資源

         DELETE:        删除伺服器資源

         CONNECT:   未使用

         TRACE:         用于測試

         OPTIONS:    擷取伺服器性能資訊

      2.請求頭:

            對請求的具體描述

      3.空行

      4.請求體:

            具體的參數或送出的内容

HTTP響應:

      1.響應行:回報具體的響應情況

          HTTP/1.1     20       OK

          版本協定   響應碼   附加資訊

       響應嗎:

           1xx:提示資訊,表示請求已經接收

           2xx:響應成功

           3xx:響應需要定向(重新記載連結第三方連結)

           4xx:用戶端錯誤

           5xx:伺服器端錯誤

      2.響應頭:

         對響應内容的具體描述

      4.響應體:

         将用戶端請求内容進行傳回

IO:

    在記憶體中存在資料交換的操作可以認為是IO操作(輸入輸出)

    IO密集程式:

         大量的IO操作,消耗CPU較少

    CPU密集程式:

         大量的記憶體CPU運算,IO相對較少

IO分類:

    阻塞IO:

       因為某些條件沒有達成 導緻程式堵塞 如:input函數

    非阻塞IO:

       改變阻塞函數的狀态不讓其阻塞

IO多路複用:

     通過一個監測

     監控多個IO事件的行為,

     哪個IO事件準備就緒就執行哪個IO事件

IO準備就緒:

     IO事件即将發生時的臨界狀态

select子產品

      監控IO事件

      rs, ws, xs = select(rlist, wlist, xlist[, timeout])

      rlist:  等待處理的IO

      wlist:  主動處理的IO

      xlist:  出錯希望去處理的IO

位運算:

   按照二進制位進行位運算操作

    & 按為與   |  按位或   ^  按位異或    << 左異    >>右移

poll方法實作IO多路複用:

   1.建立poll對象:

       p = select.poll

   2.注冊關注的IO:

       p.register(s, POLLIN | PLLERR)

       不關注:

          p.unregister(s)

       事件類别:

          POLLIN  POLLOUT  POLLERR  POLLHUP   POLLPRI

            rlist           wlist          xlist          斷開       緊急處理 

   3.監控IO:

       events = p.poll()

       功能:監控關注的IO事件

       傳回值:

           傳回發生IO事件

   events是一個清單[(fileno, evnet), (), ()....]

   每個就緒IO對應一個元組(描述符,就緒事件)

           IO地圖:{s.fileno():s}

   4.處理IO事件

本地套接字:

   作用:

      用于本地檔案不同程式間進行資料傳輸

   本地套接字傳輸流程:

      1.建立本地套接字對象

          sockfd = socket(AF_UNIX, SOCK_STREAM)

      2.綁定套接字檔案,如果檔案不存在則自動建立 存在則報錯

         sockfd.bind(file)

      3.監聽

         listen

      4.消息收發

         recv send

多任務程式設計:

     通過程式利用計算機的多個核心達到同時執行多個任務的目的

     是以達到提升程式運作效率的目的

     并行:

        多個計算機核心在同時處理多個任務,

        這時多個任務之間是并行關系

     并發:

        同時運作多個任務,核心在多個任務之間的不斷切換,

        達到多個任務都會執行的處理效果

        此時多個任務之間是并發關系

     程式:

        可執行檔案,是靜态的,隻占有磁盤

     程序:

        是一個動态過程  程式的運作過程

     CPU時間片:

         如果有個程序占有CPU此時我們稱為該程序占有CPU的時間片

         多個程序任務或輪流占有CPU時間片并形成并發效果

    程序特征:

        程序是作業系統配置設定資源的最小單元

        每個程序擁有自己獨立的運作空間(4個G的虛拟記憶體空間)

        程序之間互相獨立各不影響

    程序的狀态:

        三态:

            就緒狀态:

                 程序具備執行條件,等待系統配置設定處理器資源進入運作态

            運作态:

                 程序占有CPU處于運作狀态

            等待态:

                 程序暫時不具備運作條件,需要阻塞等待

        五态:

             在三态的基礎上增加建立和終止态 

             建立:

                  建立一個新的程式,擷取系統資源的過程

             終止:

                  程序執行結束,釋放資源的過程

OS子產品:

   判斷一個檔案是否存在:

       os.path.exists(file)

   删除檔案:

       os.remove(file)

       os.unlink(file)

   建立程序:

       os.fork()

   擷取程序id:

       os.getpid()

   擷取父程序id:

       os.getppid()

   退出一個程序:

       os.exit()

       sys.exit(退出提示)

   sys.exit() 可以通過捕獲 SystemExit異常退出

孤兒程序:

    當父程序優先于子程序退出,此時子程序就會成為孤兒程序

    孤兒程序會被系統指定程序收養  退出後會自動處理

僵屍程序:

    當子程序優先于父程序退出,父程序沒有處理子程序的退出狀态

    就會變成僵屍程序   僵屍程序會滞留PCB 消耗記憶體資源

如何避免僵屍程序的産生:

    1.父程序先退出

    2.父程序處理子程序狀态

處理僵屍程序:   

       PID,status = os.wait():

           wait 在父程序中阻塞等待處理子程序的退出

           傳回退的子程序的怕pid和退出狀态

       pid,status = os.waitpid(pid,option):

           waitpid 在父程序阻塞等待處理子程序的退出

           參數 :

               pid   -1 表示等待任意子程序退出 

                     >0 表示等待對應PID号的子程序退出 option 

                      0 表示阻塞等待 WNOHANG 表示非阻塞 

利用二級子程序:

      父程序建立子程序等待程序退出

      子程序建立下一個程序,然後立即退出

      二級子程序成為孤兒程序  處理具體工作

multiprocessing子產品

   process()

     功能:

       建立程序對象

     參數:

       target:函數對象

       name 給程序新名稱()

       args:元組 用來給target函數位置傳參

       kwargs:字典 用來給target函數鍵值傳參

   啟動程序:

       p.start()

         調用綁定函數有子程序運作

   等待子程序退出:

       p.join([逾時檢測])

          不使用join回收可能後産生僵屍程序

   使用multiprocessing建立程序子程序同樣複制父程序的全部記憶體空間

   之後有自己的獨立空間 執行上互不幹擾 子程序也有自己的PID特有資源等

   使用multiprocessing建立子程序,一般父程序功能就是隻用來建立子程序

   回收子程序,傳回事件交給子程序完成