Java網絡編程入門(一)

前言:這是本人在慕課網上學習 一站式學習Java網絡編程 全面理解BIO/NIO/AIO 時所做的筆記,供本人複習之用,不保證一定準確。

目錄

第一章 Socket概述

1.1 簡述

1.2 通過socket發送數據

1.3 通過socket接收數據

第二章 同步異步阻塞非阻塞

2.1 同步與異步

2.2. 阻塞與非阻塞

2.3 同步阻塞 同步非阻塞 異步阻塞 異步非阻塞

第三章 網絡通信中的線程池


第一章 Socket概述

1.1 簡述

可以產生和接收IO流的數據源是多種多樣的,在網絡編程的世界裏,我們有一種特殊的數據源叫做socket,socket的本意是電源插座,在現實生活中,連接上電源插座,可以接收傳輸的是電流,那麼在網絡編程中,我們綁定socket之後,接收傳輸的是IO流。

可以從幾個不同的層次來理解Socket的作用。

比較高的,概括性的:

可以理解Socket是所有網絡通信的端點,在tcp/ip協議中,我們可以用ip:端口來唯一標識一個進程,socket就是網絡當中,你想和另外一臺機器或進程進行網絡通信時的端點,這個端點代表對方的進程,通過其進行交流。

unix中的socket:

unix系統中一切皆文件,這裏的文件不只是我們平常概念中的文本文件,或者有個什麼樣的數據文件,而是說在unix系統中,所有的可以進行數據傳輸的接口全部統一是文件,比如剛纔的socket是可以進行數據傳輸的,對於unix來說,也可以看作是文件,在unix中,所有已被打開的文件,系統內核都會給它一個文件描述符,文件描述符其實就是一個整數,一般從0開始排,每打開一個文件,我們就賦予一個新的數字,0,1,2,3...,系統的內核會維護一個表格,表格叫做文件描述符表,在表裏有所有內核管理着的,已經打開的,所謂的文件對應的文件描述符和文件相關的一些信息,在進程的層面,系統當中可以運行各種各樣的應用,每一個進程在進程層面上也會維護一個文件描述符表,比如我們有兩個進程,進程a和進程b,進程a裏面可能有一個文件描述符是4,指向某個socket,在進程b的文件描述符表中,有個文件描述符是10,指向的也許是同一個socket,每個進程維護的文件描述符表中不同的值可能從內核的角度來說對應的是同一個文件(抽象上的),各個進程所打開的進行數據交換的數據輸入輸出的接口都是通過進程層面的文件描述符表對應到內核層面的文件描述符表。

1.2 通過socket發送數據

應用進程是瀏覽器,socket是網絡端點,還會有一個網卡的驅動程序(我們需要網卡在硬件層面把數據傳送出去)。

1. 首先應用進程創建一個socket,是抽象的網絡端點。

2. 將socket綁定到指定的ip:端口上,即告訴網卡,所有有關某個ip:端口的輸入輸出都綁定到此socket上。

3. 應用進程將需要發送的數據發送到socket。

4. 網卡從socket中收到數據,並把數據從硬件層面發送到目的地。

1.3 通過socket接收數據

1. 首先創建socket。

2. 綁定,讓網卡驅動程序知道,這個剛剛生成的socket究竟是綁定至哪一個ip:端口。

3. 網卡一旦識別出從網絡中傳送來的數據是想要傳送給某個應用進程對應的ip:端口的時候,驅動程序就知道這個地址已經綁定到一個特定的socket,就會把數據發送到指定的socket。

4. 最後應用進程就可以從socket中讀取它想要的數據。

第二章 同步異步阻塞非阻塞

2.1 同步與異步

同步:

假設有個男生向女生表白,女生花時間處理這個請求,男生默默等待女生回覆,男生等女生回覆後(處理完請求)再做響應。

異步:

假設有個男生向女生表白,女生花時間處理這個請求,並且跟男生髮消息,你該幹嘛幹嘛去,等我想好了再發信息告訴你,然後男生就去做別的去了,等收到回覆再響應。

2.2. 阻塞與非阻塞

阻塞式調用:

發出的請求的一方,在收到回覆之前什麼都不做。

非阻塞式調用:

發出的請求的一方,發出去之後就去做別的去了,等收到回覆再響應。

2.3 同步阻塞 同步非阻塞 異步阻塞 異步非阻塞

從上面可以看出,同步異步指的是通信機制不同的區別,阻塞與非阻塞指的是在結果返回之前,調用方處於什麼樣的狀態,它們之間可以兩兩組合,形成四種情況。

同步阻塞:調用方一直等待被調用方的回覆,發送方不處理其它的事情

同步非阻塞:調用方發送請求後處理一些其它的事情,沒有一直等着被調用方處理完請求再回復。

異步阻塞:在異步的情況下,仍有可能出現阻塞式調用,被調用方可能已經回覆表示處理完會告訴你結果,但是調用方依舊一直等待處理結果,在處理結果出來前什麼都不做。

異步非阻塞:調用方發送請求後處理一些其它的事情,被調用方立刻通知調用方稍後會回覆結果,讓調用方去做別的事情,之後會把結果發過來。

注意同步非阻塞與異步非阻塞的區別:主要就是被調用方會處理完後發送結果,另一個是收到消息立刻發送響應(表示可以去做別的了),處理完再發送結果。

 

第三章 網絡通信中的線程池

再典型的網絡通信下,服務器可能在短時間內收到多個請求,如果只開一個線程會處理的比較慢,如果用多線程處理的話,就是來一個請求就開一個線程處理,等線程處理完再銷燬,這樣耗費的資源太大了,我們可以創建一個線程池,當有請求過來時交給線程池去處理,如果有需要返回值的就讓請求實現Callable接口,不然就是Runnble接口,最終會從線程池中得到Future對象,通過這個對象我們可以知道請求是否已完成,請求結果是多少。

可以創建的線程池類型:

對於一些常見的情形,Java已經提供了對應的線程池供我們使用(具體怎麼可以百度):

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章