1. 程式人生 > >Python全棧開發--網絡編程一

Python全棧開發--網絡編程一

in use 5.6 hide 一對一 ket 版本 增刪改 smi click

一、軟件開發的架構

涉及到兩個程序之間通訊的應用大致可以分為兩種:

第一種是應用類:qq、微信、網盤這一類是屬於需要安裝的桌面應用

第二種是web類:比如百度、知乎、博客園等使用瀏覽器訪問就可以直接使用的應用

這些應用的本質其實都是兩個程序之間的通訊。而這兩個分類又對應了兩個軟件開發的架構:C/S架構和B/S架構

C/S架構

C/S即:Client與Server ,中文意思:客戶端與服務器端架構,這種架構也是從用戶層面(也可以是物理層面)來劃分的。

這裏的客戶端一般泛指客戶端應用程序EXE,程序需要先安裝後,才能運行在用戶的電腦上,對用戶的電腦操作系統環境依賴較大。

技術分享圖片

B/S架構

B/S即:Browser與Server,中文意思:瀏覽器端與服務器端架構,這種架構是從用戶層面來劃分的。

Browser瀏覽器,其實也是一種Client客戶端,只是這個客戶端不需要大家去安裝什麽應用程序,只需在瀏覽器上通過HTTP請求服務器端相關的資源(網頁資源),客戶端Browser瀏覽器就能進行增刪改查。

技術分享圖片

二、網絡基礎

1.一個程序如何在網絡上找到另一個程序?

首先,程序必須要啟動,其次,必須有這臺機器的地址,我們都知道我們人的地址大概就是國家\省\市\區\街道\樓\門牌號這樣字。那麽每一臺聯網的機器在網絡上也有自己的地址,

它的地址是怎麽表示的呢?就是使用一串數字來表示的,例如:100.4.5.6

技術分享圖片
IP地址是指互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議地址),是IP Address的縮寫。IP地址是IP協議提供的一種統一的地址格式,它為互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。

IP地址是一個32位的二進制數,通常被分割為4個“8位二進制數”(也就是4個字節)。IP地址通常用“點分十進制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進制整數。例:點分十進IP地址(100.4.5.6),實際上是32位二進制數(01100100.00000100.00000101.00000110)。
View Code
"端口"是英文port的意譯,可以認為是設備與外界通訊交流的出口。

2.osi七層模型

引子

須知一個完整的計算機系統是由硬件、操作系統、應用軟件三者組成,具備了這三個條件,一臺計算機系統就可以自己跟自己玩了(打個單機遊戲,玩個掃雷啥的)

如果你要跟別人一起玩,那你就需要上網了,什麽是互聯網?

互聯網的核心就是由一堆協議組成,協議就是標準,比如全世界人通信的標準是英語,如果把計算機比作人,互聯網協議就是計算機界的英語。所有的計算機都學會了互聯網協議,那所有的計算機都就可以按照統一的標準去收發信息從而完成通信了。

osi七層模型

人們按照分工不同把互聯網協議從邏輯上劃分了層級:

技術分享圖片

3.socket概念

socket層

技術分享圖片

理解socket

Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口後面,

對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。

技術分享圖片
其實socket就是一個模塊。我們通過調用模塊中已經實現的方法建立兩個進程之間的連接和通信。也有人將socket說成ip+port,因為ip是用來標識互聯網中的一臺主機的位置,而port是用來標識這臺機器上的一個應用程序。
所以我們只要確立了ip和port就能找到一個應用程序,並且使用socket模塊來與之通信。
View Code

4.套接字(socket)的發展史

套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 Unix,即人們所說的 BSD Unix。 因此,有時人們也把套接字稱為“伯克利套接字”或“BSD 套接字”。

一開始,套接字被設計用在同 一臺主機上多個應用程序之間的通訊。這也被稱進程間通訊,或 IPC。套接字有兩種(或者稱為有兩個種族),分別是基於文件型的和基於網絡型的。

基於文件類型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信

基於網絡類型的套接字家族

套接字家族的名字:AF_INET

還有AF_INET6被用於ipv6,還有一些其他的地址家族,不過,他們要麽是只用於某個平臺,要麽就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有地址家族中,AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是由於我們只關心網絡編程,所以大部分時候我麽只使用AF_INET.

5.tcp協議和udp協議

TCP(Transmission Control Protocol)可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向字節流。使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸程序。

UDP(User Datagram Protocol)不可靠的、無連接的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP)。

我知道說這些你們也不懂,直接上圖。

技術分享圖片

三、套接字(socket)初使用

基於TCP協議的socket

tcp是基於鏈接的,必須先啟動服務端,然後再啟動客戶端去鏈接服務端

server端

技術分享圖片
import socket
sk = socket.socket()        #建立一個通信工具,比如打電話時需要買一個手機
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)   # 避免服務重啟的時候報address already in use
sk.bind((192.168.13.35,8080))          #把地址綁定到套接字,sk.bind((‘ip‘,‘port‘))  ip地址和端口
sk.listen()                    #監聽鏈接
conn,addr = sk.accept()   #接受客戶端鏈接
while True:
    ret = conn.recv(1024).decode(utf-8)   #接收客戶端信息,每次接受1024字節,用utf-8解碼
    if ret == bye:
         break
    print(ret)
    info = input(>>>)
    conn.send(bytes(info,encoding=utf-8))   #向客戶端發送信息,必須是bytes類型的,用utf-8編碼
conn.close()
sk.close()
server

client端

技術分享圖片
import socket
sk = socket.socket()
sk.connect((192.168.13.96,8080))
while True:
    info = input(>>>)
    sk.send(bytes(info,encoding=utf-8))
    ret = sk.recv(1024).decode(utf-8)
    print(ret)
    if info == bye:
        sk.send(bbye)
        break
sk.close()
client

Python全棧開發--網絡編程一