Web這個詞剛開始顯得有些泛泛,似乎“沖浪”、“網上存在”以及“主頁”等等都和它拉上了一些關系。甚至還有一種“Internet綜合症”的說法,對許多人狂熱的上網行為提出了質疑。我們在這裡有必要作一些深入的探討,但在這之前,必須理解客戶機/服務器系統的概念,這是充斥著許多令人迷惑的問題的又一個計算領域。
1. 客戶機/服務器計算
客戶機/服務器系統的基本思想是我們能在一個統一的地方集中存放信息資源。一般將數據集中保存在某個數據庫中,根據其他人或者機器的請求將信息投遞給對方。客戶機/服務器概述的一個關鍵在於信息是“集中存放”的。所以我們能方便地更改信息,然後將修改過的信息發放給信息的消費者。將各種元素集中到一起,信息倉庫、用於投遞信息的軟件以及信息及軟件所在的那台機器,它們聯合起來便叫作“服務器”(Server)。而對那些駐留在遠程機器上的軟件,它們需要與服務器通信,取回信息,進行適當的處理,然後在遠程機器上顯示出來,這些就叫作“客戶”(Client)。
這樣看來,客戶機/服務器的基本概念並不復雜。這裡要注意的一個主要問題是單個服務器需要同時向多個客戶提供服務。在這一機制中,通常少不了一套數據庫管理系統,使設計人員能將數據布局封裝到表格中,以獲得最優的使用。除此以外,系統經常允許客戶將新信息插入一個服務器。這意味著必須確保客戶的新數據不會與其他客戶的新數據沖突,或者說需要保證那些數據在加入數據庫的時候不會丟失(用數據庫的術語來說,這叫作“事務處理”)。客戶軟件發生了改變之後,它們必須在客戶機器上構建、調試以及安裝。所有這些會使問題變得比我們一般想象的復雜得多。另外,對多種類型的計算機和操作系統的支持也是一個大問題。最後,性能的問題顯得尤為重要:可能會有數百個客戶同時向服務器發出請求。所以任何微小的延誤都是不能忽視的。為盡可能緩解潛伏的問題,程序員需要謹慎地分散任務的處理負擔。一般可以考慮讓客戶機負擔部分處理任務,但有時亦可分派給服務器所在地的其他機器,那些機器亦叫作“中間件”(中間件也用於改進對系統的維護)。
所以在具體實現的時候,其他人發布信息這樣一個簡單的概念可能變得異常復雜。有時甚至會使人產生完全無從著手的感覺。客戶機/服務器的概念在這時就可以大顯身手了。事實上,大約有一半的程序設計活動都可以采用客戶機/服務器的結構。這種系統可負責從處理訂單及信用卡交易,一直到發布各類數據的方方面面的任務——股票市場、科學研究、政府運作等等。在過去,我們一般為單獨的問題采取單獨的解決方案;每次都要設計一套新方案。這些方案無論創建還是使用都比較困難,用戶每次都要學習和適應新界面。客戶機/服務器問題需要從根本上加以變革!
2. Web是一個巨大的服務器
Web實際就是一套規模巨大的客戶機/服務器系統。但它的情況要復雜一些,因為所有服務器和客戶都同時存在於單個網絡上面。但我們沒必要了解更進一步的細節,因為唯一要關心的就是一次建立同一個服務器的連接,並同它打交道(即使可能要在全世界的范圍內搜索正確的服務器)。
最開始的時候,這是一個簡單的單向操作過程。我們向一個服務器發出請求,它向我們回傳一個文件,由於本機的浏覽器軟件(亦即“客戶”或“客戶程序”)負責解釋和格式化,並在我們面前的屏幕上正確地顯示出來。但人們不久就不滿足於只從一個服務器傳遞網頁。他們希望獲得完全的客戶機/服務器能力,使客戶(程序)也能反饋一些信息到服務器。比如希望對服務器上的數據庫進行檢索,向服務器添加新信息,或者下一份訂單等等(這也提供了比以前的系統更高的安全要求)。在Web的發展過程中,我們可以很清晰地看出這些令人心喜的變化。
Web浏覽器的發展終於邁出了重要的一步:某個信息可在任何類型的計算機上顯示出來,毋需任何改動。然而,浏覽器仍然顯得很原始,在用戶迅速增多的要求面前顯得有些力不從心。它們的交互能力不夠強,而且對服務器和因特網都造成了一定程度的干擾。這是由於每次采取一些要求編程的操作時,必須將信息反饋回服務器,在服務器那一端進行處理。所以完全可能需要等待數秒乃至數分鐘的時間才會發現自己剛才拼錯了一個單詞。由於浏覽器只是一個純粹的查看程序,所以連最簡單的計算任務都不能進行(當然在另一方面,它也顯得非常安全,因為不能在本機上面執行任何程序,避開了程序錯誤或者病毒的騷擾)。
為解決這個問題,人們采取了許多不同的方法。最開始的時候,人們對圖形標准進行了改進,使浏覽器能顯示更好的動畫和視頻。為解決剩下的問題,唯一的辦法就是在客戶端(浏覽器)內運行程序。這就叫作“客戶端編程”,它是對傳統的“服務器端編程”的一個非常重要的拓展。