天天看點

《Python核心程式設計(第3版)》——2.2 用戶端/伺服器架構

本節書摘來自異步社群《python核心程式設計(第3版)》一書中的第2章,第2.2節,作者[美] wesley chun(衛斯理 春),孫波翔 李斌 李晗 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

什麼是用戶端/伺服器架構?對于不同的人來說,它意味着不同的東西,這取決于你問誰以及描述的是軟體還是硬體系統。在這兩種情況中的任何一種下,前提都很簡單:伺服器就是一系列硬體或軟體,為一個或多個用戶端(服務的使用者)提供所需的“服務”。它存在唯一目的就是等待用戶端的請求,并響應它們(提供服務),然後等待更多請求。

另一方面,用戶端因特定的請求而聯系伺服器,并發送必要的資料,然後等待伺服器的回應,最後完成請求或給出故障的原因。伺服器無限地運作下去,并不斷地處理請求;而用戶端會對服務進行一次性請求,然後接收該服務,最後結束它們之間的事務。用戶端在一段時間後可能會再次發出其他請求,但這些都被當作不同的事務。

目前最常見的用戶端/伺服器架構如圖2-1所示,其中描繪了一個使用者或用戶端計算機通過網際網路從一台伺服器上檢索資訊。盡管這樣的系統确實是一個用戶端/伺服器架構的例子,但它不是唯一的情況。此外,用戶端/伺服器架構既可以應用于計算機硬體,也可以應用于軟體。

《Python核心程式設計(第3版)》——2.2 用戶端/伺服器架構

列印(列印機)伺服器是硬體伺服器的一個例子。它們處理傳入的列印作業并将其發送給系統中的列印機(或其他的列印裝置)。這樣的計算機通常可以通過網絡進行通路,并且用戶端計算機将向它發送列印請求。

硬體伺服器的另一個例子就是檔案伺服器。這些通常都是擁有龐大通用存儲容量的計算機,可以被用戶端遠端通路。用戶端計算機會挂載伺服器計算機上的磁盤,看起來好像這個磁盤就在本地計算機上一樣。支援檔案伺服器的一個最流行的網絡作業系統就是sun公司的網絡檔案系統(nfs)。如果你正在通路一個網絡磁盤驅動器,并且無法分辨它是在本地還是網絡上,那麼此時用戶端/伺服器系統就已經完成了它的任務。它的目标就是讓使用者得到與通路本地磁盤完全相同的體驗,抽象起來就是正常的磁盤通路,而這些都是通過程式設計實作來確定以這種方式進行。

軟體伺服器也運作在一塊硬體之上,但是沒有像硬體伺服器那樣的專用外圍裝置(如列印機、磁盤驅動器等)。軟體伺服器提供的主要服務包括程式執行、資料傳輸檢索、聚合、更新,或其他類型的程式設計或資料操作。

現在一個更常見的軟體伺服器就是web伺服器。如果個人或公司想要運作自己的web伺服器,那麼必須擁有一台或多台計算機,在上面安裝希望提供給使用者的web頁面和web應用程式,然後啟動web伺服器。一個這樣的伺服器的工作就是接受用戶端請求,并向(web)用戶端(即使用者計算機上的浏覽器)回送web頁面,然後等待下一個用戶端的請求。這些伺服器一旦開啟,都将可能永遠運作。雖然它們并不能實作這一目标,但是它們會盡可能長時間地運作,除非受到一些外力驅使才會停止,如顯式地關閉,或災難性地關閉(由于硬體故障)。

資料庫伺服器是另一種類型的軟體伺服器。它們接受用戶端的存儲或檢索請求,響應請求,然後等待更多的事務。與web伺服器類似,它們也是永遠運作的。

我們将讨論的最後一類軟體伺服器就是窗體(window)伺服器,幾乎可以認為這些伺服器是硬體伺服器。它們運作在一台附帶(外接)顯示裝置(如顯示器)的計算機上。窗體用戶端其實就是一些程式,這些程式需要一個視窗化的環境來運作。這些通常被當作圖形使用者界面(gui)應用程式。如果在沒有窗體伺服器的情況下執行它們,也即意味着在一個基于文本的環境中,如dos視窗或一個unix shell中,那麼将無法啟動它們。一旦能夠通路窗體伺服器,那麼一切都會正常。

在網絡領域,這種環境會變得更加有趣。窗體用戶端通常的顯示裝置就是本地計算機上的伺服器,但是在一些網絡化的窗體環境(如x window系統)中,也可以選擇另一台計算機的窗體伺服器作為一個顯示裝置。在這種情況下,你就可以在一台計算機上運作一個gui程式,而将它顯示在另一台計算機上!

想象用戶端/伺服器架構如何工作的一個方法就是,在你的腦海中建立一個畫面,那就是一個銀行出納員,他既不吃不睡,也不休息,服務一個又一個的排隊客戶,似乎永遠不會結束(見圖2-2)。這個隊列可能很長,也可能空無一人,但在任何給定的某個時刻,都可能會出現一個客戶。當然,在幾年前這樣的出納員完全是一種幻想,但是現在的自動取款機(atm)似乎比較接近這種模型。

《Python核心程式設計(第3版)》——2.2 用戶端/伺服器架構

當然,出納員就是一個運作在無限循環中的伺服器,而每個客戶就是一個用戶端,每個用戶端都有一個需要解決的需求。這些客戶到達銀行,并由出納以“先來先服務”的方式處理。一旦一個事務完成,客戶就會離開,而出納員要麼為下一位客戶服務,要麼坐下來等待,直到下一位客戶到來。

為什麼所有這些都很重要呢?因為在一般意義上,這種執行風格正是用戶端/伺服器架構的工作方式。既然現在你已經有了基本的概念,接下來就讓我們将它應用到網絡程式設計上,而網絡程式設計正是遵循用戶端/伺服器架構的軟體模型。

在伺服器響應用戶端請求之前,必須進行一些初步的設定流程來為之後的工作做準備。首先會建立一個通信端點,它能夠使伺服器監聽請求。可以把伺服器比作公司前台,或者應答公司主線呼叫的總機接線員。一旦電話号碼和裝置安裝成功且接線員到達時,服務就可以開始了。

這個過程與網絡世界一樣,一旦一個通信端點已經建立,監聽伺服器就可以進入無限循環中,等待用戶端的連接配接并響應它們的請求。當然,為了使公司電話接待員一直處于忙碌狀态,我們絕不能忘記将電話号碼放在公司信箋、廣告或一些新聞稿上;否則,将沒有人會打電話過來!

相似地,必須讓潛在的客戶知道存在這樣的伺服器來處理他們的需求;否則,伺服器将永遠不會得到任何請求。想象着建立一個全新的網站,這可能是最了不起的、勁爆的、令人驚異的、有用的并且最酷的網站,但如果該網站的web位址或url從來沒有以任何方式廣播或進行廣告宣傳,那麼永遠也不會有人知道它,并且也将永遠不會看到任何通路者。

現在你已經非常了解了伺服器是如何工作的,這就已經解決了較困難的部分。用戶端比伺服器端更簡單,用戶端所需要做的隻是建立它的單一通信端點,然後建立一個到伺服器的連接配接。然後,用戶端就可以送出請求,該請求包括任何必要的資料交換。一旦請求被伺服器處理,且用戶端收到結果或某種确認資訊,此次通信就會被終止。