成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Netty詳解

worldligang / 796人閱讀

摘要:的產(chǎn)生原因是使的編程更容易。定義一個異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,幫助快速開發(fā)高性能的客戶端與服務(wù)端。每一個一個客戶端請求注冊一個這個會處理這個請求的事件直到這個請求結(jié)束。

近日在學(xué)習(xí)netty,卻發(fā)現(xiàn)沒那么容易上手,專研了幾天后算是弄清楚了netty到底是干什么的,所看資料比較多,此文章便把這些資料與我的思考做一個總結(jié)幫助大家更好入門。

要更好理解netty首先要了解以下一些前置知識

Blocking I/O ,請看以下Java 網(wǎng)絡(luò)編程的一段代碼

public class PlainOioServer {
 public void serve(int port) throws IOException {
 final ServerSocket socket = new ServerSocket(port);
 try {
 for (;;) {
 //accept一直阻塞直到獲取一個客戶端,所謂阻塞就是不執(zhí)行后面代碼,不阻塞就是繼續(xù)執(zhí)行后續(xù)代碼
 final Socket clientSocket = socket.accept();
 System.out.println(
 "Accepted connection from " + clientSocket);
 //創(chuàng)建一個新的Thread處理
 new Thread(new Runnable() {
 @Override
 public void run() {
 OutputStream out;
 try {
 out = clientSocket.getOutputStream();
 out.write("Hi!
".getBytes(
 Charset.forName("UTF-8")));
 out.flush();
 clientSocket.close();
 }
 catch (IOException e) {
 e.printStackTrace();
 }
 finally {
 try {
 clientSocket.close();
 }
 catch (IOException ex) {
 // ignore on close
 }
 }
 }
 }).start();
 }
 }
 catch (IOException e) {
 e.printStackTrace();
 }
 }
}

當(dāng)請求很多的時候會為每一個請求創(chuàng)建一個線程,每一個線程都會分配一定的內(nèi)存,而且這些線程都會阻塞,導(dǎo)致資源利用率低下,這樣的設(shè)計一定滿足不了高并發(fā)。

Non-blocking I/O ,為了滿足多個請求Java引入了NIO包進(jìn)行編程,這里得引入幾個名詞

   回調(diào)(Callback):A方法里有B方法的一個引用,當(dāng)B方法完成某一條件后可以通知A方法
   事件驅(qū)動(Event-driven):當(dāng)一個事件放生時,可以在任何時間響應(yīng)這個事件
   

具體代碼就不貼了了,涉及很多類看著頭暈,網(wǎng)上也有很多解析,對著下面一張圖我說一下原理


對于每一個socket,就對應(yīng)一個Channel,每個Channel會到Selector注冊,當(dāng)某一個Channel狀態(tài)改變的時候,就會觸發(fā)響應(yīng)的事件,然后根據(jù)事件的類型去執(zhí)行相應(yīng)的動作。Channel狀態(tài)改變會通知selector,這就是上面指的回調(diào),根據(jù)發(fā)生事件的類型去執(zhí)行任務(wù)就是所謂的事件驅(qū)動,流程算是清楚了,但是為什么這么做呢,這一點我再好好解釋。

典型的后端服務(wù)分為通信層和業(yè)務(wù)邏輯層,通信層通常連接數(shù)很多(用戶大部分時間實在瀏覽而非點擊),收發(fā)數(shù)據(jù)是慢速I/O。傳統(tǒng)方式做的話每個請求分配線程,而且線程常常因為等待I/O阻塞,且不同線程間頻繁切換,這都是很浪費資源的。多線程的好處就是當(dāng)一個線程阻塞時,另一個線程可以繼續(xù)執(zhí)行任務(wù),而這種模式下大部分線程都會因I/O而阻塞。怎么令線程不阻塞呢,我們就要使用異步回調(diào)的方式,用一個線程去管理這些請求的狀態(tài),當(dāng)某個請求數(shù)據(jù)準(zhǔn)備好了就去調(diào)用它,沒準(zhǔn)備好就操作下一個請求,這就是上面的selector。

Netty的產(chǎn)生原因是使Java NIO的編程更容易。

Netty

定義:一個異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,幫助快速開發(fā)高性能的客戶端與服務(wù)端。

上面是Netty的一張架構(gòu)圖。

每一個Channel(一個客戶端請求)注冊一個EventLoop,這個EventLoop會處理這個請求的I/O事件直到這個請求結(jié)束。

未完待續(xù)。。。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68257.html

相關(guān)文章

  • 少啰嗦!一分鐘帶你讀懂Java的NIO和經(jīng)典IO的區(qū)別

    摘要:的選擇器允許單個線程監(jiān)視多個輸入通道。一旦執(zhí)行的線程已經(jīng)超過讀取代碼中的某個數(shù)據(jù)片段,該線程就不會在數(shù)據(jù)中向后移動通常不會。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說的阻塞式IO)的API時,很快就會發(fā)現(xiàn)一個問題:我什么時候應(yīng)該使用經(jīng)典IO,什么時候應(yīng)該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經(jīng)典IO之...

    Meils 評論0 收藏0
  • Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App詳解(四)

    Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App,項目介紹。Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App,項目github鏈接。本章完整代碼鏈接。 本章內(nèi)容 (1) 查詢好友列表的接口 (2)通過或忽略好友請求的接口 (3)添加好友功能展示 查詢好友列表的接口 /** * @Description: 查詢我的好友列表 ...

    why_rookie 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<