您好,登錄后才能下訂單哦!
本文作者:黃小斜
轉載請務必在文章開頭注明出處和作者。
Java作為一門后端語言,對于網絡編程的支持是必不可少的,但是,作為一個經常CRUD的Java工程師,很多時候都不需要接觸到網絡編程,自然而然地對這個東西不那么重視了,畢竟,即使像是JVM虛擬機,Java多線程,在平時工作的時候還會用到一些,但是對于網絡編程,除非你做的東西確實是需要自己寫通訊服務代碼的,比如網絡游戲,以及偏向中間件方向的開發, 可能會接觸到一些網絡編程的實踐,要不然在平時的開發工作中確實不多見。
讓我們看下網絡編程在百度百科上的定義:網絡編程最主要的工作就是在發送端把信息通過規定好的協議進行組裝包,在接收端按照規定好的協議把包進行解析,從而提取出對應的信息,達到通信的目的。
那么,為什么網絡編程重要呢,簡單來說,計算機之間之所以能夠通信,靠的就是網絡編程,只不過平時這些代碼不需要我們自己來寫罷了,TCP/IP的協議代碼已經封裝在了Linux內核中 ,而Tomcat里的代碼則負責處理一個個網絡請求,返回請求方需要的數據。再比如像netty這樣的網絡編程框架,也會把復雜的NIO處理邏輯封裝成簡單的API,即使如此,需要使用netty來做服務端開發的工程師仍然不多。
Java網絡編程對于Java工程師來說是很重要的能力,這也是我在接觸了一系列相關面試題,以及Tomcat和netty實現之后才逐漸意識到的,想要了解這兩個東西的實現原理,就必須要會網絡編程的知識,當然了,這一切的基礎就是你要首先懂得計算機網絡,這部分內容也可以參考我關于計算機網絡的一篇文章。
計算機網絡之于Java網絡編程,好比數據結構之于算法,前者是后者的基礎,沒有前者的支撐,直接學習后者,是沒有意義的。
之前我也寫了一篇關于計算機網絡該怎么學的文章,可以先看看。總體來看,計算機網絡告訴我們的是,兩臺計算機想要進行通信,它們需要約定一種傳輸協議和編碼解碼的標準,因此計算機網絡通常分為5層,而其中一些標準就包括TCP和IP,HTTP等等,這些協議都是為了更好地實現網絡數據傳輸而產生的。
但是,這些協議只是協議而已,要真正在Java代碼里實現網絡傳輸,就需要讓代碼實現協議,當然了,像TCP/IP這樣通用的協議棧。還輪不到Java應用程序自己來實現,否則也太麻煩了,Linux的內核里已經對其進行了封裝,并且會向上提供API,所以Java應用程序只需要調用Linux內核提供的即可。
而再往上,也就是HTTP這類應用層協議,Java代碼是可以直接進行解析或者組裝的,畢竟HTTP的報文比較簡單,我們可以直接通過Java提供的API進行操作,大家也都知道,Java里有一些網絡編程的包,提供了一些常用于網絡通訊的類,比如Socket可以用來建立網絡連接,IO流則可以用來處理網絡傳輸的IO輸入和輸出。
換言之,網絡編程的實質就是先進行網絡連接,然后進行IO傳輸,而網絡IO這個東西里又大有門道,這部分內容我們在下一節里繼續分享。
說到這三個東西,相比學過Java的朋友都不會陌生,畢竟面試題也經常考,背也都背下來了。
但是這幾個東西為什么會有這樣的區別呢,不妨一起來探究一下。
BIO是最原始的Java IO模式,也叫阻塞式IO,多個BIO處理必須要串行執行,因為IO此時被阻塞了。
而NIO則是相對較新的一種模式,它基于Linux的epoll來進行實現,通過一個線程對多個連接進行處理,當發現有活躍的連接時進行對應的IO處理,本質上是IO多路復用的一種實現。
而AIO和上面兩者不太一樣,它強調的不是阻塞非阻塞,而是對IO的處理是異步化的,通常來說就是建立連接,然后提供一個處理完IO的回調接口,然后就可以扔在一邊不管了,等待IO處理結束后回調相應的接口。值得一提的是,AIO需要底層操作系統的支持。
了解了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這個服務器我們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/h3pl/Java-Tutorial
整合全網優質Java學習內容,幫助你從基礎到進階系統化復習Java。
關于如何學習Java網絡編程,并且搞定相關面試題,我們今天就講到這里了,如果還有什么疑問也可以到我公眾號里找我探討,后續會有更多的文章推出,包括如何系統性地學習JavaWeb,以及如何系統性地學習后端技術。敬請期待。
對了,你想問我文章里提到的資源去哪找?我已經給你準備好了
文中提到的資源都可以免費領取,在我的公眾號【程序員黃小斜】回復“Java網絡編程“即可免費領取對應的資源。
如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉發朋友圈就是對我最大的支持啦,你們的支持是對我最大的鼓勵。
對本系列文章有什么建議和意見,也歡迎留言告訴我,期待你的回饋。
微信公眾號:程序員黃小斜
知乎:黃小斜
B站:黃小斜
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。