在網絡編程中(同樣在其它形式的通訊中,例如數據庫編程),使用套接字的應用程序也被分為兩類--客戶端程序和服務器程序。你可能對"客戶端/服務器編程"術語比較熟悉,盡管這個術語的準確意思你不一定清楚。下面的范例就是討論這個主題。
1、 客戶端/服務器范型
客戶端/服務器范型把軟件分為兩類--客戶端程序和服務器程序??蛻舳塑浖右粋€連接并發送請求,而服務器軟件監聽連接并處理請求。在UDP編程環境中,沒有建立實際的連接,并且UDP應用程序可以在相同的套接字上建立并接收請求。在TCP環境中,兩臺計算機之間建立了連接,客戶端/服務器范型是相對應的。
當軟件作為客戶端或者服務器的時候,它嚴格地定義了角色以更容易適應我們所熟悉的思維模型。軟件要么啟動請求,要么處理請求。在兩種角色之間切換使系統更加復雜。即使允許切換,在某個特定的時刻軟件程序也只能是客戶端,而另一個必須是服務器。如果兩個同時是客戶端,就沒有服務器處理請求了。
客戶端/服務器范型是一個重要的理論概念,它廣泛用于實際應用程序中。目前也有其它的通訊模型,例如對等(peer to peer)模型,在這種模型中每一方都可以啟動通訊。但是客戶端/服務器概念是更加流行的選擇,因為它很簡單并且在多數網絡編程中使用。
2、網絡客戶端
網絡客戶端啟動連接,通常處理網絡事務。服務器程序用于實現客戶端的請求--客戶端不用實現服務器的請求。盡管客戶端處于控制地位,但是服務器端仍然有一些功能??蛻舳丝梢砸蠓掌鲃h除本地文件系統的所有文件,但是服務器并不是必須執行這個任務的。
網絡客戶端使用雙方都同意的通訊標準(即網絡協議)與服務器對話。例如HTTP客戶端使用的命令組就與郵件客戶端使用的不同,而且目的也完成不同。把HTTP連接到郵件服務器,或郵件客戶端連接到HTTP服務器,要么會出現一個錯誤消息,要么出現一個客戶端不能理解的錯誤消息。因為這個原因,作為協議規格的一部分,必須使用某個端口號,這樣客戶端才能定位服務器。Web服務器通常運行在80端口上,而其它一些服務器可能運行在非標準的端口上,URL的習慣是不列出端口的,它假定使用80端口。
3、網絡服務器
網絡服務器的角色是綁定某個特定的端口(客戶端使用它定位服務器),并且監聽新的連接。盡管客戶端是臨時的,并且只有在用戶選中的時候才運行,但是服務器程序必須不間斷地運行(即使實際上沒有已連接的客戶端),期望某個客戶端在某個時刻需要該服務。服務器程序通常作為數據自適應監視器進程引用,使用Unix用法。它持久的運行,而且一般在該服務器程序的主機啟動時啟動。因此服務器一直等待,直到某個客戶端建立到該服務器端口的連接。有些服務器程序在某個時刻只能處理單個連接,其它一些服務器程序可以通過使用多線程同時處理多個連接。
當開始連接后,服務器就服從客戶端。它等待客戶端發送請求,并且"忠實地"處理它們(可是服務器可以響應錯誤信息,特別是當請求違反某些重要地協議規則或有安全風險的時候)。某些協議(例如HTTP/1.0)通常在每個連接中只允許一個請求,而其它一些協議(例如POP3)支持一系列請求。服務器可以通過發送響應或錯誤消息應答客戶端的請求。學習新的網絡協議(編寫客戶端或服務器)與學習一種新的語言相似,只是語法改變了。但是典型情況下,它的命令的數量更小,使事情更簡單。服務器的行為一部分由協議決定,一部分由開發者決定(某些命令是可選的,服務器不一定支持)。
原文轉自:http://www.anti-gravitydesign.com