IO之Socket網絡編程

1、Socket

  Socket不是Java中獨有的概念,而是一個語言無關標準。任何能夠實現網絡編程的編程語言都有Socket。java

1,Socket概念

  網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。程序員

  創建網絡通訊鏈接至少要一個端口號。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員作網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通訊的能力。編程

  Socket的英文原義是「孔」或「插座」。做爲BSD UNIX的進程通訊機制,取後一種意思。一般也稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊。在Internet上的主機通常運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不一樣的端口對應於不一樣的服務。Socket正如其英文原義那樣,像一個多孔插座。一臺主機猶如佈滿各類插座的房間,每一個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不一樣編號的插座,就能夠獲得不一樣的服務。服務器

2,Socket鏈接步驟

  根據鏈接啓動的方式以及本地套接字要鏈接的目標,套接字之間的鏈接過程能夠分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。【若是包含數據交互+斷開鏈接,那麼一共是五個步驟】網絡

(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態。異步

(2)客戶端請求:是指由客戶端的套接字提出鏈接請求,要鏈接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要鏈接的服務器的套接字,指出服務器端套接字的地址和端口號,而後就向服務器端套接字提出鏈接請求。socket

(3)鏈接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求,它就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,鏈接就創建好了。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求。編程語言

3,Socket在Java中應用

  在java.net 包是網絡編程的基礎類庫。其中ServerSocket 和Socket 是網絡編程的基礎類型。ServerSocket 是服務端應用類型。Socket 是創建鏈接的類型。當鏈接創建成功後,服務器和客戶端都會有一個Socket 對象示例,能夠經過這個Socket 對象示例,完成會話的全部操做。函數

  對於一個完整的網絡鏈接來講,Socket 是平等的,沒有服務器客戶端分級狀況。spa

2、IO阻塞與非阻塞

  阻塞和非阻塞是針對於進程在訪問數據的時候,根據IO操做的就緒狀態來採起的不一樣方式,說白了是一種讀取或者寫入操做方法的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入方法會當即返回一個狀態值。
以銀行取款爲例:

  阻塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java調用會一直阻塞到讀寫完成才返回);

  非阻塞 : 櫃檯取款,取個號,而後坐在椅子上作其它事,等號廣播會通知你辦理,沒到號你就不能去,你能夠不斷問大堂經理排到了沒有,大堂經理若是說還沒到你就不能去(使用非阻塞IO時,若是不能讀寫Java調用會立刻返回,當IO事件分發器通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成)

3、IO同步與異步

  同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發IO 操做並等待或者輪詢的去查看IO 操做是否就緒,而異步是指用戶進程觸發IO 操做之後便開始作本身的事情,而當IO 操做已經完成的時候會獲得IO 完成的通知。

以銀行取款爲例:  

  同步 : 本身親自出馬持銀行卡到銀行取錢(使用同步IO 時,Java 本身處理IO 讀寫);

  異步 : 委託一小弟拿銀行卡到銀行取錢,而後給你(使用異步IO 時,Java 將IO 讀寫委託給OS 處理,須要將數據緩衝區地址和大小傳給OS(銀行卡和密碼),OS 須要支持異步IO操做API)。

4、同步異步阻塞非阻塞區別

  在研究同步異步阻塞非阻塞時,總感受阻塞/非阻塞和同步/異步有殊途同歸的地方,其實,這二者存在本質的區別,面向的對象是不一樣的。

  阻塞/非阻塞:進程/線程須要操做的數據若是還沒有就緒,是否妨礙了當前進程/線程的後續操做。

  同步/異步:數據若是還沒有就緒,是否須要等待數據結果。

相關文章
相關標籤/搜索