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

来源:https://www.cnblogs.com/xll1025/archive/2020/03/20/12535279.html
-Advertisement-
Play Games

原創聲明 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 本文思維導圖 簡介 Java作為一門後端語言,對於網路編程的支持是必不可少的,但是,作為一個經常CRUD的Java工程師,很多時候都不需要接觸到網路編程,自然而然地對這個東西不那麼重視了,畢竟,即使像是JVM虛擬機,Java多線程,在 ...


副本_未命名.jpg

原創聲明

本文作者:黃小斜

轉載請務必在文章開頭註明出處和作者。

本文思維導圖

在這裡插入圖片描述

簡介

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站:黃小斜

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 談到JAVA,就不得不提JVM JAVA程式員繞不開的話題.也許有童鞋會說,我不懂JVM,但是我一樣可以寫出JAVA代碼,我相信說這種話的童鞋,往往是只有1 3年的初級開發人員,對JAVA理解還不深,不明白JVM的重要性,那接下來我們來說說,為什麼要學習JVM? 1.理解JVM,才能幫助我們寫 ...
  • 一、BufferedWriter 1.使用帶有緩衝區的字元讀和寫進行試驗 package com.bjpowernode.java_learning; import java.io.*; ​ public class D100_1_BufferedWriter { public static voi ...
  • 隨機回去10位幸運者的名單,依次遞減,最後一位就是幸運者 1 package com.lottery.controller; 2 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5 import java.io.IOExce ...
  • 線程池 導包: 回調函數非同步將可迭代對象中的元素進行某種操作 註意事項:callback必須有一個參數,且只能有一個參數 非同步主要是被應用在耗時的操作 測試:同步&非同步效率 搭建一個flask,自己啟動服務,測試執行時間 新建一個 新建一個 文件夾,在該文件夾下創建一個HTML文件,我寫的是 ,隨便 ...
  • const修飾普通成員函數 我們知道this指針指向的是具體的對象,普通的成員函數存在(加深記憶),設計this指針的時候格式為*const this(常量指針)。 const修飾變數一般有兩種方式:const T *a,或者 T const *a,這兩者都是一樣的,主要看const位於*的左邊還是 ...
  • 1. MyBatis認識 MyBatis是一款優秀的持久層框架,它支持定製化SQL、存儲過程以及高級映射。MyBatis可以使用簡單的XML配置或註解來配置和映射原生信息,將介面和Java的POJO(Plain Ordinary Java Object,普通Java對象)映射成資料庫中的數據。 2. ...
  • 之前在寫多線程與多進程的時候,因為一般情況下都是各自完成各自的任務,各個子線程或者各個子進程之前並沒有太多的聯繫,如果需要通信的話我會使用隊列或者資料庫來完成,但是最近我在寫一些多線程與多進程的代碼時,發現如果它們需要用到共用變數的話,需要有一些註意的地方 多線程之間的共用數據 標準數據類型線上程間 ...
  • 畢業設計管理系統 畢業設計管理系統可以分為五個模塊:登錄模塊,選題模塊,信息管理模塊,流程管理模塊,文件管理模塊。 該系統在技術上使用Spring+SpringMVC+MyBatis整合框架作為後臺開發框架,AmazeUI作為前端開發框架。 並使用Ehcache作為項目的緩存,druid作為項目的數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...