傳統socket網絡程式設計
1.1 實戰
服務端:ServerBoot
Server
ClientHandler
用戶端:Client
先後啟動 ServerBoot、Client,分别輸出如下:
1.2 傳統HTTP伺服器原理
建立一個ServerSocket
監聽并綁定一個端口一系列用戶端來請求這個端口伺服器使用Accept,獲得一個來自用戶端的Socket連接配接對象
啟動一個新線程處理連接配接讀Socket,
得到位元組流解碼協定
得到Http請求對象處理Http請求
得到一個結果
封裝成一個HttpResponse對象編碼協定
将結果序列化位元組流寫Socket
将位元組流發給用戶端
繼續循環步驟3
1.3 C/S 互動流程
Netty版socket網絡程式設計
下面分别介紹圖中對應元件。
Netty核心元件
3.1 NioEventLoop
3.1.1 簡介
EventLoop,其實一個 eventloop 就是一個 eventexecutor
NioEventLoopGroup 是一個處理 I/O 操作的多線程事件循環。Netty 為不同類型傳輸提供各種 EventLoopGroup 實作。在此示例中,我們實作伺服器端應用程式,是以将使用兩個 NioEventLoopGroup。第一個,通常稱為'boss',接受傳入的連接配接。第二個(通常稱為'從業人員')在上司接受連接配接并登記到從業人員後處理接受連接配接的流量。使用多少線程以及如何映射到建立的通道取決于 EventLoopGroup 實作,甚至可能通過構造函數進行配置。
作為Netty的發動機
Server端
Client端
while(true)就對應一個 run 方法
NioEventLoop#run
netty有不同的io程式設計模型實作。
以NIO為例,對IO事件的處理是在NioEventLoop裡做的,事件的注冊在下面的方法
不同僚件調用unsafe的不同方法,netty對底層socket的操作都是通過unsafe來做的 unsafe主要由兩種不同的實作:
NioMessageUnsafe NioServerSocketChannel使用的是NioMessageUnsafe來做socket操作
NioByteUnsafe NioSocketChannel使用NioByteUnsafe來做socket操作
處理每一個連接配接
EventExecutorGroup
EventExecutorGroup 負責經由其使用next()方法提供EventExecutor。除此之外,還負責處理自己的生命周期,并允許在全局模式中關閉它們。
EventExecutor
該EventExecutor是個特殊的EventExecutorGroup,附帶一些快捷方法,看是否有Thread在事件循環執行。除此之外,它還繼承了EventExecutorGroup以允許通用的方法來通路。
eventloopGroup
特殊的 EventExecutorGroup,它允許注冊 Channel,即事件循環期間可以執行 channel 操作,得到處理,供以後選用
3.2 Channel
以服務端的NioMessageUnsafe為例來看下read()方法的實作,對應是否有新連接配接進來的情況
直接把底層的 channel 封裝成 NioSocketChannel
3.3 ByteBuf
3.4 Pipeline
netty 将其抽象成邏輯鍊,看看 netty 是怎麼把每個 pipeline 加入到用戶端連接配接的
3.5 ChannelHandler