1. 程式人生 > >五分鐘學Java:如何學習Java面試必考的網路程式設計

五分鐘學Java:如何學習Java面試必考的網路程式設計

![副本_未命名.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NDQ3NjYwLTE1ODYzOTE2NWVlMWY5NmUuanBn?x-oss-process=image/format,png) ## 原創宣告 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 ## 本文思維導圖 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200320215332444.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E3MjQ4ODg=,size_16,color_FFFFFF,t_70) ## 簡介 Java作為一門後端語言,對於網路程式設計的支援是必不可少的,但是,作為一個經常CRUD的Java工程師,很多時候都不需要接觸到網路程式設計,自然而然地對這個東西不那麼重視了,畢竟,即使像是JVM虛擬機器,Java多執行緒,在平時工作的時候還會用到一些,但是對於網路程式設計,除非你做的東西確實是需要自己寫通訊服務程式碼的,比如網路遊戲,以及偏向中介軟體方向的開發, 可能會接觸到一些網路程式設計的實踐,要不然在平時的開發工作中確實不多見。 讓我們看下網路程式設計在百度百科上的定義:網路程式設計最主要的工作就是在傳送端把資訊通過規定好的協議進行組裝包,在接收端按照規定好的協議把包進行解析,從而提取出對應的資訊,達到通訊的目的。 那麼,為什麼網路程式設計重要呢,簡單來說,計算機之間之所以能夠通訊,靠的就是網路程式設計,只不過平時這些程式碼不需要我們自己來寫罷了,TCP/IP的協議程式碼已經封裝在了Linux核心中 ,而Tomcat裡的程式碼則負責處理一個個網路請求,返回請求方需要的資料。再比如像netty這樣的網路程式設計框架,也會把複雜的NIO處理邏輯封裝成簡單的API,即使如此,需要使用netty來做服務端開發的工程師仍然不多。 Java網路程式設計對於Java工程師來說是很重要的能力,這也是我在接觸了一系列相關面試題,以及Tomcat和netty實現之後才逐漸意識到的,想要了解這兩個東西的實現原理,就必須要會網路程式設計的知識,當然了,這一切的基礎就是你要首先懂得計算機網路,這部分內容也可以參考我關於計算機網路的一篇文章。 ## 本文思維導圖 ## Java網路程式設計該怎麼學 ### 計算機網路和Java網路程式設計的關係 計算機網路之於Java網路程式設計,好比資料結構之於演算法,前者是後者的基礎,沒有前者的支撐,直接學習後者,是沒有意義的。 之前我也寫了一篇關於計算機網路該怎麼學的文章,可以先看看。總體來看,計算機網路告訴我們的是,兩臺計算機想要進行通訊,它們需要約定一種傳輸協議和編碼解碼的標準,因此計算機網路通常分為5層,而其中一些標準就包括TCP和IP,HTTP等等,這些協議都是為了更好地實現網路資料傳輸而產生的。 但是,這些協議只是協議而已,要真正在Java程式碼裡實現網路傳輸,就需要讓程式碼實現協議,當然了,像TCP/IP這樣通用的協議棧。還輪不到Java應用程式自己來實現,否則也太麻煩了,Linux的核心裡已經對其進行了封裝,並且會向上提供API,所以Java應用程式只需要呼叫Linux核心提供的即可。 而再往上,也就是HTTP這類應用層協議,Java程式碼是可以直接進行解析或者組裝的,畢竟HTTP的報文比較簡單,我們可以直接通過Java提供的API進行操作,大家也都知道,Java裡有一些網路程式設計的包,提供了一些常用於網路通訊的類,比如Socket可以用來建立網路連線,IO流則可以用來處理網路傳輸的IO輸入和輸出。 換言之,網路程式設計的實質就是先進行網路連線,然後進行IO傳輸,而網路IO這個東西里又大有門道,這部分內容我們在下一節裡繼續分享。 ### 網路程式設計裡BIO、NIO和AIO 說到這三個東西,相比學過Java的朋友都不會陌生,畢竟面試題也經常考,背也都背下來了。 但是這幾個東西為什麼會有這樣的區別呢,不妨一起來探究一下。 BIO是最原始的Java IO模式,也叫阻塞式IO,多個BIO處理必須要序列執行,因為IO此時被阻塞了。 而NIO則是相對較新的一種模式,它基於Linux的epoll來進行實現,通過一個執行緒對多個連線進行處理,當發現有活躍的連線時進行對應的IO處理,本質上是IO多路複用的一種實現。 而AIO和上面兩者不太一樣,它強調的不是阻塞非阻塞,而是對IO的處理是非同步化的,通常來說就是建立連線,然後提供一個處理完IO的回撥介面,然後就可以扔在一邊不管了,等待IO處理結束後回撥相應的介面。值得一提的是,AIO需要底層作業系統的支援。 ### 通訊框架netty 瞭解了BIO、NIO和AIO之後,你對於網路程式設計中的幾個核心概念你應該已經有所瞭解了,接下來就不得不看看Java網路程式設計中最牛掰的一個框架:netty了。比起NIO和BIO,瞭解netty的人應該更少了,其實,netty就是基於NIO實現的非同步網路程式設計框架,既有了NIO的高效能IO處理方式,又通過非同步化程式設計使得netty的程式設計方式更加簡單高效。 我當時接觸netty的時候,還是在學習RPC和分散式服務的時候,我發現每當有RPC出現的地方,也總有網路程式設計框架的身影,好比netty這樣的通訊框架常常會被提到,我當時並不太理解通訊框架是幹嘛用的,以至於我對RPC是什麼東西都不太理解。 當我現在搞懂了RPC之後,再去研究網路程式設計框架就有了新的感覺,其實,不管是RPC還是HTTP,都需要通訊框架的支援,只不過支援HTTP的伺服器已經有很多了,比如Tomcat,比如Nginx,這些伺服器完全可以cover掉網路框架,後面我們也會再來聊一下Tomcat這個神奇的伺服器。 ### Tomcat這個神奇的伺服器 Tomcat這個伺服器我們Java工程師一直在用,但是很多朋友對它其實知之甚少,只知道它可以執行JavaWeb應用。 其實Tomcat這個伺服器,也是基於NIO實現的一個伺服器,不妨把Tomcat分為兩個部分來看,一部分是connector,負責網路連線,接受請求和處理請求,另一部分是container,也就是容器,Tomcat本質上是一個servlet容器,這一部分負責的就是編排一系列容器裡的處理器、呼叫鏈以及層級結構,比如engine的下一層是host,host的下一層是context。 當一個網路請求到達Tomcat時,connector先負責處理這個請求,再扔到container跑一遍拿到結果,但在生產環境中,connector一次性要處理的請求就多的去了,因此就必須要支援高併發以及IO多路複用,因此Tomcat也採用了NIO的IO處理方式,同時通過多執行緒進行請求處理,總體來說已經達到了非常不錯的效能了。 ### 面向面試複習 一個小小的Java網路程式設計,居然一下子牽扯出這麼多複雜的知識點出來,先是計算機網路,再到Java網路程式設計API,再到BIO、NIO和AIO,然後又談到了Tomcat和netty。 其實,網路程式設計的內容可能還不止這些,比如NIO的底層實現是基於Linux的epoll來完成了,而Linux的網路IO模型有select、poll和epoll等方式,要真正搞懂NIO,你還需要搞懂epoll。 其實一開始我對於Java網路程式設計也沒有什麼概念,只不過在看了很多面試題之後,才逐漸發現問題所在,比如BIO和NIO的區別,背了好幾次面試答案仍然不解其意,要是再問到epoll、poll和select的區別,更是完全不得要領,究其原因還是不知道這些東西到底是什麼,有什麼用,以及它們和一些實際場景間的關係。 因此,我覺得,網路程式設計方向的面試題重在理解概念,對於計算機網路、IO模型,以及網路程式設計框架要能夠真正理解了這些東西之後,你才能夠對面試題遊刃有餘,否則,這類面試題再怎麼背都不會有什麼效果,正如計算機網路這種純理論的課程一樣,在不理解的情況下,分析問題和回答問題肯定是難以達到面試官要求的。 所以,請按照這樣的一個順序進行復習和實踐,相信這對於你學習網路程式設計會有所幫助。 1、計算機網路知識 2、Java網路程式設計基礎 3、NIO、BIO、AIO 4、Linux的網路IO模型:epoll、select和poll 5、netty網路程式設計框架 6、Tomcat伺服器 ## 推薦資源 這方面能推薦的資源就非常多了,我儘量按照先易後難的順序為大家推薦資源 ### 書籍 《Java網路程式設計》 《netty權威指南》 《How Tomcat Work》 《Tomcat架構解析》 ### 視訊 我整理一些Java網路程式設計複習的視訊資源,習慣看視訊的朋友可以瞭解一下。 ### 部落格 Java技術倉庫《Java程式設計師複習指南》 https://github.com/h2pl/Java-Tutorial 整合全網優質Java學習內容,幫助你從基礎到進階系統化複習Java。 ### 總結 關於如何學習Java網路程式設計,並且搞定相關面試題,我們今天就講到這裡了,如果還有什麼疑問也可以到我公眾號裡找我探討,後續會有更多的文章推出,包括如何系統性地學習JavaWeb,以及如何系統性地學習後端技術。敬請期待。 對了,你想問我文章裡提到的資源去哪找?我已經給你準備好了 > 文中提到的資源都可以免費領取,在我的公眾號【程式設計師黃小斜】回覆“Java網路程式設計“即可免費領取對應的資源。 ## 寫在最後 如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉發朋友圈就是對我最大的支援啦,你們的支援是對我最大的鼓勵。 對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。 微信公眾號:程式設計師黃小斜 知乎:黃小斜 B站: