Netty網(wǎng)絡(luò)編程零基礎(chǔ)入門
OSI七層網(wǎng)絡(luò)模型
應(yīng)用層:Http協(xié)議、文件服務(wù)器、郵件服務(wù)器
表示層:數(shù)據(jù)轉(zhuǎn)換解決不同系統(tǒng)中間通訊的兼容問題
會(huì)話層:建立與應(yīng)用程序的會(huì)話連接(socket)
傳輸層:提供端口號(hào)(區(qū)分不同的應(yīng)用程序)和傳輸?shù)膮f(xié)議(TCP和UDP)
網(wǎng)絡(luò)層:為數(shù)據(jù)實(shí)現(xiàn)路由(路由器、交換機(jī))
數(shù)據(jù)鏈路層:對(duì)傳輸?shù)牡刂返膸约板e(cuò)誤的檢測(cè)。
物理層:以二進(jìn)制的形式在物理機(jī)器.上實(shí)現(xiàn)傳輸。(光纖、專線、各種物理介質(zhì)實(shí)現(xiàn))
Socket技術(shù)
屬于傳輸層非常核心的內(nèi)容任何的編程語言都是支持socket (網(wǎng)絡(luò)編程技術(shù)) 技術(shù)開發(fā),目的就是解決兩個(gè)應(yīng)用程序通訊的問題;注意: socket 不屬于某種協(xié)議,只是網(wǎng)絡(luò)編程技術(shù)。socket技術(shù)支持兩種協(xié)議(TCP和UDP) 。
應(yīng)用場(chǎng)景: http協(xié)議、rpc框架
TCP協(xié)議是一個(gè)可靠的協(xié)議,因?yàn)榻⑦B接的時(shí)候必須通過三次握手才可以實(shí)現(xiàn)數(shù)據(jù)傳輸,所以數(shù)據(jù)不會(huì)丟失。
UDP協(xié)議面向無連接協(xié)議,UDP在通訊的時(shí)候不需要對(duì)方的存在,屬于不可靠傳輸,可能存在數(shù)據(jù)丟包的問題。應(yīng)用場(chǎng)景:聊天
TCP協(xié)議
三次握手:經(jīng)過三次握手之后建立通訊才開始進(jìn)行數(shù)據(jù)傳輸
白話文描述:
1、第一次握手:客戶端會(huì)給服務(wù)端發(fā)送消息問:你在不在?
2、第二次握手:服務(wù)端收到了客戶端咨詢的(”你在不在?“),服務(wù)端就給客戶端發(fā)送消息回復(fù),就說:我在。
3、第三次握手:客戶端收到服務(wù)端回復(fù)我在的呢”,客戶端就會(huì)給服務(wù)端發(fā)送消息,開始傳輸數(shù)據(jù)。
三次握手成功之后,開始建立連接傳輸數(shù)據(jù)。
專業(yè)術(shù)語描述:
Syn (建立連接)、Ack (確認(rèn)標(biāo)記)、fin (終 止標(biāo)記)
1.第一次握手:客戶端會(huì)向服務(wù)器端發(fā)送代碼syn=1, 隨機(jī)會(huì)產(chǎn)生一-個(gè)數(shù)SEQ=x發(fā)送到我們的服務(wù)器端;
2.第二次握手:服務(wù)器端確認(rèn)收到syn和X值,回復(fù)給客戶端ack=x+1和seq = y (隨機(jī)數(shù))發(fā)送給客戶端。
3.第三次握手:客戶端接受syn、ack、y值之后向服務(wù)器發(fā)送ack=y+1,此包發(fā)送完畢之后就可以開始建立連接。
為什么要有三次握手,不是兩次?
兩次可能存在網(wǎng)絡(luò)抖動(dòng)的情況下,三次握手比較穩(wěn)定。第三次握手也可以叫預(yù)傳輸數(shù)據(jù),看看數(shù)據(jù)是否可以傳輸過去。
四次揮手:可靠關(guān)閉連接
關(guān)閉連接:
第一次揮手: 客戶端向服務(wù)器端發(fā)送釋放的報(bào)文,停止發(fā)送數(shù)據(jù) fin=1、生成一個(gè)序列號(hào)seq=u;
第二次揮手: 服務(wù)器端接受到釋放的報(bào)文后,發(fā)送ack=u+1;隨機(jī)生成的seq=v給客戶端;當(dāng)前狀態(tài)為關(guān)閉等待狀態(tài),客戶端收到了服務(wù)器確認(rèn)通知之后,此時(shí)客戶端就會(huì)進(jìn)入到終止?fàn)顟B(tài),等待服務(wù)器端發(fā)送釋放報(bào)文。
第三次揮手:服務(wù)器端最后數(shù)據(jù)發(fā)送完畢之后,就向客戶端發(fā)送連接釋放報(bào)文,F(xiàn)IN=1,ack=u+1 當(dāng)前為半關(guān)閉狀態(tài),隨機(jī)生成一個(gè)隨機(jī)樹w
第四次揮手,客戶端必須發(fā)出確認(rèn),ACK=1,ack=w+1,而自己的序列號(hào)是seq=u+1,此時(shí),客戶端就進(jìn)入了TIME-WAIT(時(shí)間等待)狀態(tài)。注意此時(shí)TCP連接還沒有釋放,必須經(jīng)過2∗∗MSL(最長報(bào)文段壽命)的時(shí)間后,當(dāng)客戶端撤銷相應(yīng)的TCB后,才進(jìn)入CLOSED狀態(tài)。
服務(wù)器只要收到了客戶端發(fā)出的確認(rèn),立即進(jìn)入CLOSED狀態(tài)。同樣,撤銷TCB后,就結(jié)束了這次的TCP連接??梢钥吹?,服務(wù)器結(jié)束TCP連接的時(shí)間要比客戶端早一些。
白話文翻譯四次揮手:
第一次揮手 客戶端向服務(wù)端發(fā)送一個(gè)釋放連接通知;
第二次揮手 服務(wù)端接受到釋放通知之后,告訴給客戶端說等待一下,因?yàn)榭赡艽嬖谟衅渌臄?shù)據(jù)沒有發(fā)送完畢,等待數(shù)據(jù)全部傳輸完畢之后就開始 關(guān)閉連接;
第三次揮手 服務(wù)器端所有的數(shù)據(jù)發(fā)送完畢之后,就告訴客戶端說現(xiàn)在可以釋放連接了。
第四次揮手: 客戶端確認(rèn)是最終釋放連接通知,ok 就開始 就向服務(wù)區(qū)端發(fā)送我們可以開始關(guān)閉連接啦;
Java語言創(chuàng)建socket應(yīng)用
這里使用BIO 模型來實(shí)現(xiàn)
服務(wù)端
public class Server { private static int port = 8585; public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(port); //開始監(jiān)聽 System.out.println("服務(wù)器開始監(jiān)聽,監(jiān)聽端口:" + port); while(true) { Socket socket = serverSocket.accept();//阻塞 等待客戶端連接 System.out.println("接受一個(gè)客戶端的請(qǐng)求....."); InputStream in = socket.getInputStream(); int len = -1; byte[] buff = new byte[1024]; while ((len = in.read(buff)) != -1) {//阻塞 等待客戶端發(fā)送數(shù)據(jù) String str = new String(buff, 0, len); System.out.println("讀取到客戶端的輸入字符:" + str); } in.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); }finally { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
客戶端
public class Client { private static int port = 8585; public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請(qǐng)輸入客戶端編號(hào):"); String no = sc.next(); Socket socket = null; try { System.out.println("客戶端"+no+"開始連接服務(wù)器.."); socket = new Socket("127.0.0.1",port); if(socket!=null){ System.out.println("客戶端:"+no+"連接服務(wù)器成功!"); } OutputStream out = socket.getOutputStream(); while(true){ System.out.println("客戶端"+no+"請(qǐng)輸入要發(fā)送字符(輸入quit表示結(jié)束):"); String str = sc.next(); if(str.trim().equalsIgnoreCase("quit")) break; out.write((no+":"+str).getBytes()); } System.out.println("客戶端"+no+"連接中斷"); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
http協(xié)議
Http協(xié)議是一種超文本傳輸?shù)膮f(xié)議,基于TCP/IP協(xié)議實(shí)現(xiàn)的包裝,img、css、html
Http協(xié)議 默認(rèn)端口號(hào)80 明文傳輸
Https協(xié)議 443 加密傳輸
Https 比http協(xié)議安全 ssl+證書實(shí)現(xiàn)傳輸
Http協(xié)議特征:
- 無狀態(tài) 沒有記憶的會(huì)話 token、jwt、Session
- 請(qǐng)求(req)與響應(yīng)模型(resp)
- 簡單快捷
- 靈活可以傳輸任何類型
Http協(xié)議版本
Http協(xié)議1.0:規(guī)定客戶端與服務(wù)器端傳輸完成之后,立馬關(guān)閉連接;短連接
Http協(xié)議1.1 :長連接
長連接與短連接
長連接:客戶端與服務(wù)器端建立連接之后,不會(huì)立馬關(guān)閉連接,會(huì)保持一定復(fù)用機(jī)制,默認(rèn)情況下在300s空閑情況下自動(dòng)斷開連接;
短連接:客戶度與服務(wù)器端發(fā)送消息之后,立馬關(guān)閉連接 如果頻繁發(fā)送Http請(qǐng)求,可能消耗服務(wù)器端資源;
到此這篇關(guān)于Netty網(wǎng)絡(luò)編程零基礎(chǔ)入門的文章就介紹到這了,更多相關(guān)Netty網(wǎng)絡(luò)編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot容器加載時(shí)執(zhí)行特定操作(推薦)
這篇文章主要介紹了Spring Boot容器加載時(shí)執(zhí)行特定操作及spring內(nèi)置的事件,需要的朋友可以參考下2018-01-01SpringBoot項(xiàng)目加入沖突動(dòng)態(tài)監(jiān)測(cè)算法的實(shí)現(xiàn)
沖突動(dòng)態(tài)監(jiān)測(cè)算法是一種網(wǎng)絡(luò)通信中的沖突檢測(cè)方法,適用于無線網(wǎng)絡(luò)或其他共享傳輸介質(zhì)的環(huán)境,本文主要介紹了SpringBoot項(xiàng)目加入沖突動(dòng)態(tài)監(jiān)測(cè)算法的實(shí)現(xiàn),感興趣的可以了解一下2023-09-09java?WebSocket?服務(wù)端實(shí)現(xiàn)代碼
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動(dòng)發(fā)送信息給客戶端,這篇文章主要介紹了java?WebSocket?服務(wù)端代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復(fù)雜對(duì)象說明
這篇文章主要介紹了SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復(fù)雜對(duì)象說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10java構(gòu)造http請(qǐng)求的幾種方式(附源碼)
本文主要介紹了java構(gòu)造http請(qǐng)求的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02SpringBoot整合Swagger3生成接口文檔過程解析
這篇文章主要介紹了SpringBoot整合Swagger3生成接口文檔過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java實(shí)現(xiàn)解數(shù)獨(dú)的小程序
最近在學(xué)習(xí)Java,然后上個(gè)月迷上了九宮格數(shù)獨(dú),玩了幾天,覺得實(shí)在有趣,就想著能不能用編程來解決,于是就自己寫了個(gè),還真解決了。下面這篇文章就給大家主要介紹了Java實(shí)現(xiàn)解數(shù)獨(dú)的小程序,需要的朋友可以參考借鑒。2017-01-01Jmeter 中 CSV 如何參數(shù)化測(cè)試數(shù)據(jù)并實(shí)現(xiàn)自動(dòng)斷言示例詳解
這篇文章主要介紹了Jmeter 中 CSV 如何參數(shù)化測(cè)試數(shù)據(jù)并實(shí)現(xiàn)自動(dòng)斷言,本文通過示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07