標籤:
在《Android網路編程》系列文章中,前面已經將Java的通訊底層大致的描述了,在我們瞭解了TCP/IP通訊族架構及其原理,接下來我們就開始來瞭解基於tcp/ip協議層的Socket抽象層。本篇文章將會讓我們清楚的瞭解和學會使用Socket。
什麼是Socket?它又是如何運作的?它的表現形式是什嗎?等等這些問題,本篇文章將逐步的揭曉。 一. 什麼是Socket Socket是應用程式層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面,你可以藉助它建立TCP串連等等,而http是個應用程式層的協議,它實際上也建立在TCP協議之上。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。 然而Socket本身並不是協議,它只是對TCP/IP協議的封裝,是一個調用介面(API),通過Socket,我們才能使用TCP/IP協議。Socket的出現只是使得程式員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數介面。 二. 它是如何運作的? 首先我們來看下其內部的通訊原理, 一台主機的應用程式C要能和另一台主機的應用程式S通訊,必須通過 Socket 建立串連,而建立 Socket 串連必須需要底層TCP/IP 協議來建立 TCP 串連。建立 TCP 串連需要底層 IP 協議來定址網路中的主機。我們知道網路層使用的 IP 協議可以協助我們根據 IP 地址來找到目標主機,但是一台主機上可能運行著多個應用程式,如何才能與指定的應用程式通訊就要通過 TCP 或 UPD 的地址也就是連接埠號碼來指定。這樣就可以通過一個 Socket 執行個體唯一代表一個主機上的一個應用程式的通訊鏈路了。 建立Socket串連至少需要一對通訊端,其中一個運行於用戶端程式C中,稱為ClientSocket ,另一個運行於伺服器端程式S中,稱為ServerSocket 。通訊端之間的串連過程分為三個步驟:伺服器等待監聽,用戶端請求,串連建立。
1>.伺服器等待監聽:ServerSocket 並不定位具體的用戶端通訊端,而是處於等待串連的狀態,即時監控網路狀態,等待用戶端的串連請求。該過程是一個阻塞過程,直到有用戶端來連結為止。
2>.用戶端請求:指用戶端的通訊端提出串連請求,要串連的目標是伺服器端的通訊端。為此,用戶端的通訊端必須首先描述它要已連線的服務器的通訊端,指出伺服器端通訊端的地址和連接埠號碼,然後就向伺服器端通訊端提出串連請求。
3>.串連確認:當伺服器端通訊端監聽到或者說接收到用戶端通訊端的串連請求時,就響應用戶端通訊端的請求,建立一個新的線程,把伺服器端通訊端的描述發給用戶端,一旦用戶端確認了此描述,雙方就正式建立串連。而伺服器端通訊端繼續處於監聽狀態,繼續接收其他用戶端通訊端的串連請求。 在建立 Socket 執行個體的建構函式正確返回之前,將要進行 TCP 的三向交握協議,TCP 握手協議完成後,Socket執行個體對象將建立完成,否則將拋出 IOException 錯誤。具體的三向交握協議可以看《Android網路編程 一 JavaSecurity之JCE(SSL/TLS)》。 三. 它的表現形式是什嗎? 以上講述的都屬於JAVA I/O 範疇,我們可以看出I/O編程中我們用的就是Socket 和 ServerSocket,通訊的資料靠Socket之間的流通道,其次在調用InputStream.read()方法時是阻塞的,它會一直等到資料到來時(或逾時)才會返回;同樣,在調用ServerSocket.accept()方法時,也會一直阻塞到有用戶端串連才會返回,每個用戶端串連過來後,服務端都會啟動一個線程去處理該用戶端的請求。當用戶端多時,會建立大量的處理線程。且每個線程都要佔用棧空間和一些CPU時間。所以Java NI/O編程就應運而生,它能夠很好的解決這些。NI/O編程可以說成非阻塞式I/O,java NIO採用了雙向通道(channel)進行資料轉送,而不是單向的流(stream),在通道上可以註冊我們感興趣的事件。一共有以下四種事件:比如讀、寫、用戶端連結事件、服務端接收連結事件。NI/O 它由一個專門的線程來處理所有的 I/O 事件,並負責分發。 事件到的時候觸發,而不是同步的去監視事件。 線程之間通過 wait,notify 等方式通訊。保證每次環境切換都是有意義的。減少無謂的線程切換。 Channels、Buffers 、Selectors 三個NIO編程的核心類。關於NIO本篇檔案就不多說了,大致的介紹下。 除此之外,它的另外一種表現形式就是在其原有的基礎上(socket 和 serversocket)加上了一層安全保護也就是SSL/TLS協議保護層。關於這一層的介紹可以參考《Android網路編程 一 JavaSecurity之JCE(SSL/TLS)》。 四. 小結 以上呢就大致的講述了Socket及其相關概念。在實際開發中,我們可能會遇到各式各樣的問題,遇到問題不可拍,可怕的是我們不瞭解問題。關於更深更多的知識就得靠自己日積月累了。
Android網路編程系列 一 Socket抽象層