1. 程式人生 > >網路程式設計——Socket(套接字)

網路程式設計——Socket(套接字)

網路程式設計

    網路程式設計的目的就是指直接或間接地通過網路協議與其他計算機進行通訊。網路程式設計中
有兩個主要的問題,一個是如何準確的定位網路上一臺或多臺主機,另一個就是找到主機後
如何可靠高效的進行資料傳輸。在TCP/IP協議中IP層主要負責網路主機的定位,資料傳輸的
路由,由IP地址可以唯一地確定Internet上的一臺主機。而TCP層則提供面向應用的可靠的
或非可靠的資料傳輸機制,這是網路程式設計的主要物件,一般不需要關心IP層是如何處理資料
的。

    目前較為流行的網路程式設計模型是客戶機/伺服器(C/S)結構。即通訊雙方一方作為服務
器等待客戶提出請求並予以響應。客戶則在需要服務時向伺服器提出申請。伺服器一般作為
守護程序始終執行,監聽網路埠,一旦有客戶請求,就會啟動一個服務程序來響應該客
戶,同時自己繼續監聽服務埠,使後來的客戶也能及時得到服務。

    在Internet上IP地址和主機名是一一對應的,通過域名解析可以由主機名得到機器的IP,
由於機器名更接近自然語言,容易記憶,所以使用比IP地址廣泛,但是對機器而言只有IP地
址才是有效的識別符號。

    通常一臺主機上總是有很多個程序需要網路資源進行網路通訊。網路通訊的物件準確的講
不是主機,而應該是主機中執行的程序。這時候光有主機名或IP地址來標識這麼多個程序顯然
是不夠的。埠號就是為了在一臺主機上提供更多的網路資源而採取得一種手段,也是TCP層
提供的一種機制。只有通過主機名或IP地址和埠號的組合才能唯一的確定網路通訊中的物件:
程序。

套接字

    所謂socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。應用程
序通常通過"套接字"向網路發出請求或者應答網路請求。

    套接字可以根據通訊性質分類,這種性質對於使用者是可見的。應用程式一般僅在同一類的
套接字間進行通訊。不過只要底層的通訊協議允許,不同型別的套接字間也照樣可以通訊。套
接字有兩種不同的型別:流套接字和資料報套接字。

    下面的解釋比較抽象,不看也罷。
    套接字是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。可以將套接字看作
不同主機間的程序進行雙向通訊的端點,它構成了單個主機內及整個網路間的程式設計介面。套接
字存在於通訊域中,通訊域是為了處理一般的執行緒通過套接字通訊而引進的一種抽象概念。套
接字通常和同一個域中的套接字交換資料(資料交換也可能穿越域的界限,但這時一定要執行
某種解釋程式)。各種程序使用這個相同的域互相之間用Internet協議簇來進行通訊。

套接字工作原理

    要通過網際網路進行通訊,你至少需要一對套接字,其中一個運行於客戶機端,我們稱之為
ClientSocket,另一個運行於伺服器端,我們稱之為ServerSocket。
    根據連線啟動的方式以及本地套接字要連線的目標,套接字之間的連線過程可以分為三個
步驟:伺服器監聽,客戶端請求,連線確認。

    所謂伺服器監聽,是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的
狀態,實時監控網路狀態。
    所謂客戶端請求,是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接
字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的
地址和埠號,然後就向伺服器端套接字提出連線請求。
    所謂連線確認,是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它
就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦
客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他
客戶端套接字的連線請求。