第四章 客戶服務器模式與套接字
一、知識點:
1、網絡應用C/S模式(C/S模式概念,協議端口號,插口地址,客戶端軟件特點,服務器軟件特點和併發,B/S模式)
2、應用編程接口API(API概念,套接字API的基本結構,套接字API服務器端實現過程,套接字API客戶端實現過程)
3、簡單例子的套接字API實例
第一部分:網絡應用C/S模式
二、相互作用的客戶-服務器模型:
1、在TCP/IP互聯網中,最主要的進程間相互作用的模式是客戶—服務器交互模式(client-server paradigm of interaction)(C/S模式)。
2、客戶和服務器分別是兩個應用程序(進程)。客戶向服務器發出服務請求,服務器做出響應。
三、爲什麼選擇客戶-服務器模式:
1、第一個原因:互聯網中資源、運算能力和信息不均等的現實。不均等現象不可避免,而客戶-服務器模式體現了這種現象並很好地適應了這種現象。
2、第二個原因:是技術性的。互聯網進程通信需要一種機制,爲準備通信的進程之間建立聯繫,爲兩者的數據交換提供同步。客戶-服務器模式完美地解決了上述問題。
綜上所述,C/S模式是客觀現實與技術實現相結合的產物。
四、客戶軟件的特點:
1、在進行通信時臨時成爲客戶,但它也可在本地進行其他的計算。
2、被用戶調用並在用戶計算機上運行,在打算通信時主動向遠地服務器發起通信。
3、可與多個服務器進行通信。
4、不需要特殊的硬件和很複雜的操作系統。
五、服務器軟件的特點:
1、專門用來提供某種服務的程序,可同時處理多個遠地或本地客戶的請求。
2、在共享計算機上運行。當系統啓動時即自動調用並一直不斷地運行着。
3、被動等待並接受來自多個客戶的通信請求。
4、一般需要強大的硬件和高級的操作系統支持。
六、兩個術語:
1、服務器:被動等待通信的程序。不是計算機。
2、服務器級計算機:運行服務器軟件的功能強大的計算機。
硬件廠商把具有高速CPU、大容量存儲器、功能強大的操作系統的計算機稱爲服務器,其實應該稱爲服務器級計算機。
七、允許一臺計算機運行多種服務器是實際可行的:
1、可以充分利用硬件資源。因爲硬件可以被多種服務所共享。
2、減少系統管理的負載。因爲這種情況可以減少被管理的計算機系統的數量。
3、如果對服務的需求比較低,那麼把服務器合併到一臺計算機上能夠顯著地減少開銷,而且並不會明顯地降低性能。
八、既然允許一臺計算機運行多種服務器,那麼一個客戶發出的請求究竟由哪個服務器來做出響應呢?
方法:傳輸協議爲每種服務分配了惟一的一個標識符,並要求服務器和客戶使用這一標識符。當服務器開始運行時,它向本地協議軟件註冊它使用的服務標示符。當客戶聯繫遠程服務器時,客戶需要指定它請求的服務標識符。客戶計算機上的傳輸協議軟件在提出請求時,向服務器計算機發送這一標識符,服務器計算機上的傳輸協議軟件使用這一標識符決定處理這一請求的服務器程序。
九、端口:
1、端口就是運輸層服務訪問點TSAP。
2、端口的作用就是讓應用層的各種應用進程都能將其數據通過端口向下交付給運輸層,以及讓運輸層知道應當將其報文段中的數據向上通過端**付給應用層相應的進程。
3、從這個意義上講,端口是用來標誌應用層的進程。
4、端口用一個16 bit端口號進行標誌。
5、端口號只具有本地意義,即端口號只是爲了標誌本計算機應用層中的各進程。在因特網中不同計算機的相同端口號是沒有聯繫的。
十、兩類端口:
1、一類是熟知端口,其數值一般爲 0~1023。當一種新的應用程序出現時,必須爲它指派一個熟知端口。
2、另一類則是一般端口,用來隨時分配給請求通信的客戶進程。
十一、併發性—客戶-服務器交互模型的基礎:
1、併發服務器可以同時爲多個客戶提供服務,並不需要每個客戶等待前一個客戶的請求完成。
2、大多數併發服務器都是動態操作的。即只有當請求到達時,服務器纔會動態地爲到來的請求創建一個新的線程。
3、服務器程序由兩部分組成:主線程和服務線程。
1)主線程:負責接收請求併爲請求創建一個服務線程來處理請求。並使服務器保持活躍狀態,主線程在創建處理請求的服務線程之後,會等待另一個請求的到來。
2)服務線程:負責處理每個請求,然後終止。
如果N個客戶同時請求一臺計算機上的給定服務,則會有N+1個線程提供服務。主線程等待額外的請求,N個服務線程與每個客戶進行交互。
十二、C/S模式的傳輸機制:
1、面向連接傳輸:使用面向連接的傳輸協議時,兩個應用必須首先建立一個連接,然後在該連接上發送數據。
2、無連接傳輸:應用可以利用無連接接口在任何時間向任何目的發送消息。
3、客戶和服務器在通信時,既可以使用面向連接傳輸協議,又可以使用無連接傳輸協議。當使用面向連接傳輸時,客戶需要首先形成一個到特定服務器的連接,該連接在客戶發送請求和接收響應的過程中保持不變。當客戶完成對服務的使用時,必須關閉這一連接。
十三、C/S模式的發展:
第一代C/S系統:基於兩層結構的,第一層是客戶端軟件,由應用程序和相應的數據庫連接程序組成。企業的業務過程都在程序中表現;第二層結合了數據庫服務器,根據客戶軟件的請求進行數據庫操作,然後將結構傳送給客戶軟件。
第一代C/S系統缺點:
1、兩層應用軟件的開發工作主要集中在客戶軟件上,客戶軟件不但要完成用戶界面和數據顯示的工作,還要完成對商業和應用邏輯的處理工作。
2、這種兩層結構僅在各自的客戶機和服務器計算機之間使用,分割了界面和商業邏輯,使得客戶機要管理複雜的軟件,導致“肥胖”客戶機的產生。
3、同時,兩層結構不能進行有效的擴展,不能支持大量用戶的訪問和高容量事務處理的應用。
第二代C/S系統:三層C/S系統。
1、這種結構從客戶機上取消了商業和應用邏輯,將它們移到中間層,即應用服務器上。
2、客戶機上只需安裝具有用戶界面和簡單的數據處理功能的應用程序。它負責處理與用戶的交互和與應用服務器的交互。
3、應用服務器負責處理商業和應用邏輯,具體地說就是接受客戶端應用程序的請求,然後根據商業和應用邏輯將這個請求轉化爲數據庫請求後與數據庫服務器交互,並將與數據庫務器交互結果傳送給客戶端應用程序。
4、數據庫服務器軟件根據應用服務器發送的請求進行數據庫操作,並將操作的結果傳送給應用服務器。
三層C/S模式比兩層C/S模式的優點在於:
1、整個系統被分成不同的邏輯塊,層次非常清晰,一層的改動不會影響其他層次;
2、能夠使“肥胖”的客戶機變得較“瘦”一些;
3、開發和管理工作向服務器端轉移,使分佈的數據處理成爲可能;
4、管理和維護變得相對簡單。
B/S模式:
隨着Web和Internet計算環境的發展,盛行一種以Web技術爲中心的應用:B/S結構
客戶機上只安裝一個瀏覽器,中間層採用Web服務器,它接受客戶端的請求,將其轉換爲SQL語句,通過ODBC或其他手段傳給數據庫服務器,並將數據庫服務器返回的結果用HTML文件格式傳回給客戶軟件。客戶實際上就是一個將標準語言轉化爲界面的解釋器。應用程序安裝在Web服務器上,其運行也是在這裏進行的。
BS模式的有點:
1、低成本,易維護的通用客戶機(瀏覽器);
2、開放的、基於標準的解決方案;
3、強有力的、多媒體的、交互式的信息發佈。
第二部分:應用編程接口API
一、套接字接口(Socket API):
API(Application Program interface):應用程序接口,是應用與傳輸協議軟件進行交互時使用的接口。API定義了一套操作,應用在於協議軟件交互時可以執行這些操作。
套接字API:是應用程序與TCP/IP協議之間的接口。這個接口是用於通信協議的幾種應用編程接口(API)之一。API作爲一種通用的通信編程接口而設計。雖然它還沒有得到標準化,但是它實際上已經成爲工業標準。
套接字庫:就是過程庫,每個過程對應着一個套接字,兩者使用相同的名字和參數。
二、套接字庫的實現:
套接字庫的實現與操作系統提供的本地套接字API的實現完全不同:
與作爲操作系統一部分的本地套接字例程不同,套接字庫過程的代碼與應用程序連接,並駐留在應用程序地址空間。當應用從套接字庫中調用過程時,控制轉向庫例程,這些庫例程反過來調用一個或多個底層的操作系統功能來完成所需的操作。
三、實現套接字API的過程:
Socket過程 該過程創建一個套接字並返回一個整數描述字。
descriptor=socket( protofamily, type, protocol)
Close過程 該過程告訴系統終止對套接字的使用。
close( socket)
Bind過程 服務器使用該過程來提供服務器所使用的、用於等待連接的協議端口號。
bind( socket, localaddr, addrlen)
Listen過程 服務器調用該過程來等待來自客戶的連接。
listen( socket, queuesize)
Accept過程 面向連接的服務器必須調用accept過程才能接收下一個連接請求。
newsock=accept( socket, caddress, caddresslen)
Connect過程 客戶調用該過程建立與特定服務器之間的連接。
connect( socket, saddress, saddresslen)
Send過程 如果套接字被連接,可以利用該過程發送數據。
send( socket, data, length, flags)
Sendto過程和Sendmsg 過程 允許客戶或服務器使用無連接套接字發送數據。
sendto( socket, data, length, flags, destaddress, addresslen)
sendmsg( socket, msgstruct, flags),msgstruct是一個結構,該結構包含了關於目的地址,目的地址的長度,發送的消息,以及消息的長度等信息。
Recv過程 應用可以調用該過程從連接套接字中接收數據。
recv( socket, buffer, length, flags)
Recvfrom過程和Recvmsg過程 如果套接字並沒有被連接,應用可以用於接收來自任意發送者的消息
recvfrom( socket, buffer, length, flags, sndraddr, saddrlen)
recvmsg( socket, msgstruct, flags),msgstruct是一個結構,該結構含有接收消息的地址和發送者的IP地址。
四、面向連接模式下使用的系統調用與無連接模式下使用的系統調用:
類型 |
建立 |
發送 |
接收 |
面向連接的服務器 |
bind,listen或者accept |
write或者send |
read或者recv |
面向連接的客戶 |
connect |
write或者send |
read或者recv |
無連接的服務器 |
bind |
sendto或者sendmsg |
recvfrom或者recvmsg |
無連接的客戶 |
bind |
sendto或者sendmsg |
recvfrom或者recvmsg |
五、其他套接字過程:
Getpeername過程:服務器在調用accept過程接收連接請求之後,可以調用該過程,以獲得啓動連接的遠程客戶的完整地址。
Gethostname過程:客戶或服務器可以調用該過程來獲取運行該程序的計算機的信息。
Gethostbyname過程:通過計算機名字返回該計算機的IP地址。客戶經常使用該過程將用戶輸入的名字轉換成相應的協議軟件所需的IP地址。
Gethpostbyaddr過程:給出一臺計算機的IP地址,它將返回該計算機的名字。當要向人們線時主機信息時,客戶或服務器就可以使用該過程。
六、客戶-服務器模式的socket實現框架:
第三部分:簡單例子的API實例
客戶建立一個與服務器的連接,然後等待輸出。當一個連接請求到達時,服務器創建一條ASCII文本消息,記錄訪問它的客戶的數目,然後通過連接發送這一消息,最後關閉連接。客戶顯示接收的數據,然後退出。
如果一個客戶向該服務器連接了10次,則客戶接到並打印的信息爲:
This server has been contacted 10 times.
該實例套接字過程調用順序
CSDN博文地址:http://blog.csdn.net/lwlliang/archive/2011/03/14/6249650.aspx