前言:
經過前面的專題中對網絡層協定和HTTP協定的簡單介紹相信大家對網絡中的協定有了大緻的了解的, 本專題将針對HTTP協定定義一個Web伺服器,我們平常浏覽網頁通過在浏覽器中輸入一個網址就可以看到我們想要的網頁,這個過程中浏覽器隻是一個用戶端,浏覽器(應用層應用程式)通過HTTP協定把使用者請求發送到服務端, 伺服器接受到發送來的HTTP請求,然後對請求進行處理和響應,最後把響應的内容發送給用戶端(浏覽器這裡充當了使用者代理的用戶端),浏覽器再對接受到的響應内容(一般是HTML檔案)進行解釋并且顯示出來。這就是一次完整的使用者請求/響應模型,本專題所講述的是一個簡單的Web伺服器,其他一些大型的Web伺服器(IIS,Apache)也是這樣的一個原理, 本專題隻是簡單講述Web伺服器的實作原理。
一、Socket程式設計實作一個簡單的Web伺服器
Socket這個概念是在Unix系統中提出來的。在Unix的時代,為了解決傳輸層的程式設計問題,Unix提供了類似于檔案操作的網絡操作方式——Socket,通過Socket,我們就可以像操作檔案一樣通過打開、寫入、讀取、關閉等操作完成網絡程式設計,這樣就使得網絡程式設計可以統一到檔案操作方面,這樣就使我們更容易地編寫網絡應用程式。需要注意的是,應用層的協定需要網絡程式專門處理,Socket不負責應用層協定,僅僅負責傳輸層的協定。
現在介紹下網絡端口号(port)的概念,在同一個網絡位址中,為了區分使用相同協定的不同應用程式,為不同的應用程式配置設定一個數字編号,我們把這個編号就成為網絡端口号(就是區分同一個網絡位址中不同的程序)。端口号是由一個兩個位元組的整數,是以取值範圍為0~65535,這些端口号又分為三類:
第一類的範圍是0~1023,稱為衆所周知的端口,這些端口号由特定的網絡程式使用,例如,TCP協定使用80端口來完成Http協定的傳輸。
第二類的範圍是1024~49151,稱為登記端口,一般情況下不應該在程式中使用。
第三類的範圍是49152~65535,稱為私有端口, 這些端口可以由普通使用者程式使用。
在我們用Socket開發網絡應用程式中,還有一個就是端點的概念,在網絡中,通過IP位址,協定和端口号可以唯一地确定網絡上的一個應用程式,其中把IP位址和端口的組合叫做端點(EndPoint)。每個Socket需要綁定到一個端點上與其他端點進行通信。
介紹完基本的一些概念後,下面示範通過Socket程式設計實作一個簡單的Web伺服器,此執行個體中就是簡單向浏覽器傳回一個固定的靜态頁面,實作代碼如下:
運作結果:
首先運作服務端後的界面:
此時在伺服器端顯示的輸出為:
這裡隻是簡單實作了一個web伺服器的功能,當然實際的Web伺服器通過使用者的發來的Http請求中獲得請求檔案類型,請求檔案名以及請求目錄等資訊,然後Web伺服器根據這些請求資訊從伺服器的實體目錄中尋找請求的檔案,如果在伺服器中找到請求的檔案,然後伺服器把響應内容發送給用戶端。這裡隻是通過這個簡單的Web伺服器讓大家了解請求/響應模型以及Web伺服器的工作原理,一些複雜的Web伺服器也是在此基礎進行一些其他功能的擴充。
二、基于TcpListener的Web伺服器
在.net平台下, 為了簡化網絡程式設計,.net對套接字又進行了一次封裝,封裝後的類是在System.Net.Sockets命名空間下的TcpListener類和TcpClient類,使用TcpListener類用來監聽和接收傳入的連接配接請求,在該類的構造函數中隻需要傳遞一組網絡端點資訊就可以準備好監聽參數,而不需要設定使用的網絡協定等細節,調用Start方法後,監聽工作就開始(間接調用了Socket.Listen方法),AcceptTcpClient方法将阻塞程序,直到一個用戶端發來連接配接請求為止,這個方法傳回一個
封裝了Socket的TcpClient對象,同時從傳入的連接配接隊列中删除該用戶端的連接配接請求。此時通過這個TcpClient對象與用戶端進行通信。
下面是基于TcpListener和TcpClient的一個簡單的Web伺服器的代碼:
程式的輸出結果和前面的用Socket實作的效果相同,這裡就不再貼圖了,這裡實作的Web伺服器都是建立控制台的應用程式來實作的,感興趣的朋友也可以用Windows窗體進行實作,同時這裡也隻是簡單列出了采用同步的方式進行實作的,同時TcpListener類和TcpClient類同時支援異步操作的方法,下面列出這個兩個類中異步操作的方法如下表:
類
方法
說明
TcpListener
BeginAcceptTcpClient
開始一個異步操作接受一個傳入的連接配接
EndAcceptTcpClient
異步接受傳入的連接配接,并建立新的TcpClient對象來處理用戶端的通信
TcpClient
BeginConnect
開始一個對遠端主機連接配接的異步請求
EndConnect
異步接受傳入的連接配接嘗試。
三、總結
到這裡這篇文章就差不多介紹到這裡了,本專題是介紹如何自定義一個簡單Web伺服器,通過這個專題希望大家可以對Web伺服器的工作過程有一個簡單的了解。
另外在這個專題裡面我們是用IE浏覽器進行發送客戶請求的,是以後面專題将介紹自定義一個浏覽器,通過我們自定義的浏覽器來對Web伺服器發送請求,然後在自己自定義的浏覽器中把響應消息顯示出來。
本文轉自LearningHard 51CTO部落格,原文連結:http://blog.51cto.com/learninghard/1038655,如需轉載請自行聯系原作者