Android网络编程系列 一 Socket抽象层
生活随笔
收集整理的這篇文章主要介紹了
Android网络编程系列 一 Socket抽象层
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在《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 。套接字之間的連接過程分為三個步驟:服務器等待監聽,客戶端請求,連接建立。
什么是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及其相關概念。在實際開發中,我們可能會遇到各式各樣的問題,遇到問題不可拍,可怕的是我們不了解問題。關于更深更多的知識就得靠自己日積月累了。轉載于:https://www.cnblogs.com/kevinOne/p/4530570.html
總結
以上是生活随笔為你收集整理的Android网络编程系列 一 Socket抽象层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Objetive-C +load方法研究
- 下一篇: 打炽寒天凤