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 等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章