Python核心編程——第2章 網絡編程 筆記
說明
本篇文章只是重點知識點摘錄,理解爲主。詳細信息請看《Python核心編程》一書,或者
Python核心編程——第2章 網絡編程 筆記 by RealEmperor
客戶端/服務器架構
概念
什麼是客戶端/服務器架構?對於不同的人來說,它意味着不同的東西,這取決於你問誰以及描述的是軟件還是硬件系統。在這兩種情況中的任何一種下,前提都很簡單:服務器就是一系列硬件或軟件,爲一個或多個客戶端(服務的用戶)提供所需的“服務”。它存在唯一目的就是等待客戶端的請求,並響應它們(提供服務),然後等待更多請求。
另一方面,客戶端因特定的請求而聯繫服務器,併發送必要的數據,然後等待服務器的 迴應,最後完成請求或給出故障的原因。服務器無限地運行下去,並不斷地處理請求;而客戶端會對服務進行一次性請求,然後接收該服務,最後結束它們之間的事務。客戶端在一段時間後可能會再次發出其他請求,但這些都被當作不同的事務。
例子
- 硬件客戶端/服務器架構
- 打印(打印機)服務器:處理傳入的打印作業並將其發送 給系統中的打印機(或其他的打印設備)。通常可以通過網絡進行訪問,並且客戶端計算機將向它發送打印請求。
- 文件服務器:通常都是擁有龐大通用存儲容量的計算機,可以被客戶端遠程訪問。如Sun 公司的 網絡文件系統(NFS)
- 軟件客戶端/服務器架構
- Web 服務器:接受客戶端請求,並向(Web)客戶端(即用戶計算機上的瀏覽器)回送 Web 頁面,然後等待下一個客戶端的請求。這些服務器一旦開啓,都將可能永遠運行。
- 數據庫服務器。它們接受客戶端的存儲或檢索請求,響應請求,然後等待更多的事務。
- 窗體(window)服務器:幾乎可以認爲這些服務器是硬件服務器。它們運行在一臺附帶(外接)顯示設備(如顯示器)的計算機上。窗體客戶端其實就是一些程序,這些程序需要一個窗口化的環境來運行。這些通常被當作圖形用戶界面(GUI)應用程序。
套接字: 通信端點(Communication Endpoints)
概念
套接字是計算機網絡數據結構,它體現了上節中所描述的“通信端點”的概念。在任何 類型的通信開始之前,網絡應用程序必須創建套接字。可以將它們比作電話插孔,沒有它將 無法進行通信。
起源
套接字的起源可以追溯到 20 世紀 70 年代,它是加利福尼亞大學的伯克利版本 UNIX(稱 爲 BSD UNIX)的一部分。因此,有時你可能會聽過將套接字稱爲伯克利套接字或 BSD 套接 字。套接字最初是爲同一主機上的應用程序所創建,使得主機上運行的一個程序(又名一個 進程)與另一個運行的程序進行通信。這就是所謂的進程間通信(Inter Process Communication, IPC)。有兩種類型的套接字:基於文件的和麪向網絡的。
分類
- 基於文件的UNIX套接字
- 族名(family name)爲AF_UNIX(又名AF_LOCAL,在POSIX1.g標準中指定)。它代表地址家族(address family):UNIX。
- 其它較舊的地址家族名稱:域(domain)或協議家族(protocol family),並使用其縮寫 PF 而 非 AF。
- 基於網絡
- 家族名字 AF_INET,或者地址家族: 因特網。
- 地址家族 AF_INET6 用於第 6 版因特網協議(IPv6)尋址。
套接字地址
主機+端口號(0~65535)
面向連接的套接字與無連接的套接字
類型 | 名稱 | 提供的服務 | 協議 |
---|---|---|---|
面向連接 | 虛擬電路或流套接字 | 序列化的、可靠的和不重複的數據交付,而沒有記錄邊界。 | 主要協議是傳輸控制協議(TCP),若使用網絡則要加上因特網協議(IP)來搜尋網絡中的主機 |
無連接 | 數據報類型的套接字 | 不保證順序性、 可靠性或重複性;記錄邊界;成本低廉 | 主要協議是用戶數據報協議(UDP),若使用網絡則要加上因特網協議(IP)來搜尋網絡中的主機 |
創建TCP\UDP服務器與客戶端
TCP服務器端僞代碼
ss = socket() # 創建服務器套接字
ss.bind() # 套接字與地址綁定
ss.listen() # 監聽連接
inf_loop: # 服務器無限循環
cs = ss.accept() # 接受客戶端連接
comm_loop: # 通信循環
cs.recv()/cs.send() # 對話(接收/發送)
cs.close() # 關閉客戶端套接字
ss.close() # 關閉服務器套接字#(可選)
TCP客戶端僞代碼
cs = socket() # 創建客戶端套接字
cs.connect() # 嘗試連接服務器
comm_loop: # 通信循環
cs.send()/cs.recv() # 對話(發送/接收)
cs.close() # 關閉客戶端套接字
UDP服務器僞代碼
ss = socket() # 創建服務器套接字
ss.bind() # 套接字與地址綁定
inf_loop: # 服務器無限循環
cs = ss.recvfrom()/ss.sendto() # 關閉(接收/發送)
ss.close() # 關閉服務器套接字
UDP客戶端僞代碼
cs = socket() # 創建客戶端套接字
comm_loop: # 通信循環
cs.sendto()/cs.recvfrom() # 對話(發送/接收)
cs.close() # 關閉客戶端套接字
SocketServer 模塊
SocketServer是標準庫中的一個高級模塊(Python 3.x中重命名爲socketserver)
- 改進點
- 簡化很多樣板代碼,它們是創建網絡客戶端和服務器所必需的代碼。
- 使用類來編寫應用程序。
- 事件驅動
Twisted框架
Twisted 是一個完整的事件驅動的網絡框架,利用它既能使用也能開發完整的異步網絡應用程序和協議。其他異步系統有Greenlets、 Tornado、Diesel、Concurrence、Eventlet、Gevent 等。