鍍金池/ 教程/ Java/ 適用快速開發(fā)的高級組件
Netty 實(shí)現(xiàn) WebSocket 聊天功能
總結(jié)
寫個(gè)時(shí)間客戶端
寫個(gè)丟棄服務(wù)器
問題
開始之前
關(guān)閉你的應(yīng)用
開始
用POJO代替ByteBuf
總結(jié)
架構(gòu)總覽
豐富的緩沖實(shí)現(xiàn)
解決
寫個(gè)應(yīng)答服務(wù)器
I/O API 統(tǒng)一的異步 I/O API
適用快速開發(fā)的高級組件
處理一個(gè)基于流的傳輸
Netty 實(shí)現(xiàn)聊天功能
基于攔截鏈模式的事件模型
寫個(gè)時(shí)間服務(wù)器
查看收到的數(shù)據(jù)

適用快速開發(fā)的高級組件

上述所提及的核心組件已經(jīng)足夠?qū)崿F(xiàn)各種類型的網(wǎng)絡(luò)應(yīng)用,除此之外,Netty 也提供了一系列的高級組件來加速你的開發(fā)過程。

Codec 框架

就像“使用POJO代替ChannelBuffer”一節(jié)所展示的那樣,從業(yè)務(wù)邏輯代碼中分離協(xié)議處理部分總是一個(gè)很不錯(cuò)的想法。然而如果一切從零開始便會遭遇到實(shí)現(xiàn)上的復(fù)雜性。你不得不處理分段的消息。一些協(xié)議是多層的(例如構(gòu)建在其他低層協(xié)議之上的協(xié)議)。一些協(xié)議過于復(fù)雜以致難以在一臺獨(dú)立狀態(tài)機(jī)上實(shí)現(xiàn)。

因此,一個(gè)好的網(wǎng)絡(luò)應(yīng)用框架應(yīng)該提供一種可擴(kuò)展,可重用,可單元測試并且是多層的 codec 框架,為用戶提供易維護(hù)的 codec 代碼。

Netty 提供了一組構(gòu)建在其核心模塊之上的 codec 實(shí)現(xiàn),這些簡單的或者高級的 codec 實(shí)現(xiàn)幫你解決了大部分在你進(jìn)行協(xié)議處理開發(fā)過程會遇到的問題,無論這些協(xié)議是簡單的還是復(fù)雜的,二進(jìn)制的或是簡單文本的。

SSL / TLS 支持

不同于傳統(tǒng)阻塞式的 I/O 實(shí)現(xiàn),在 NIO 模式下支持 SSL 功能是一個(gè)艱難的工作。你不能只是簡單的包裝一下流數(shù)據(jù)并進(jìn)行加密或解密工作,你不得不借助于 javax.net.ssl.SSLEngine,SSLEngine 是一個(gè)有狀態(tài)的實(shí)現(xiàn),其復(fù)雜性不亞于 SSL 自身。你必須管理所有可能的狀態(tài),例如密碼套件,密鑰協(xié)商(或重新協(xié)商),證書交換以及認(rèn)證等。此外,與通常期望情況相反的是 SSLEngine 甚至不是一個(gè)絕對的線程安全實(shí)現(xiàn)。

在 Netty 內(nèi)部,SslHandler 封裝了所有艱難的細(xì)節(jié)以及使用 SSLEngine 可 能帶來的陷阱。你所做的僅是配置并將該 SslHandler 插入到你的 ChannelPipeline 中。同樣 Netty 也允許你實(shí)現(xiàn)像 StartTlS 那樣所擁有的高級特性,這很容易。

HTTP 實(shí)現(xiàn)

HTTP無 疑是互聯(lián)網(wǎng)上最受歡迎的協(xié)議,并且已經(jīng)有了一些例如 Servlet 容器這樣的 HTTP 實(shí)現(xiàn)。因此,為什么 Netty 還要在其核心模塊之上構(gòu)建一套 HTTP 實(shí)現(xiàn)?

與現(xiàn)有的 HTTP 實(shí)現(xiàn)相比 Netty 的 HTTP 實(shí)現(xiàn)是相當(dāng)與眾不同的。在HTTP 消息的低層交互過程中你將擁有絕對的控制力。這是因?yàn)?Netty 的HTTP 實(shí)現(xiàn)只是一些 HTTP codec 和 HTTP 消息類的簡單組合,這里不存在任何限制——例如那種被迫選擇的線程模型。你可以隨心所欲的編寫那種可以完全按照你期望的工作方式工作的客戶端或服務(wù)器端代碼。這包括線程模型,連接生命期,快編碼,以及所有 HTTP 協(xié)議允許你做的,所有的一切,你都將擁有絕對的控制力。

由于這種高度可定制化的特性,你可以開發(fā)一個(gè)非常高效的HTTP服務(wù)器,例如:

  • 要求持久化鏈接以及服務(wù)器端推送技術(shù)的聊天服務(wù)(如,Comet )
  • 需要保持鏈接直至整個(gè)文件下載完成的媒體流服務(wù)(如,2小時(shí)長的電影)
  • 需要上傳大文件并且沒有內(nèi)存壓力的文件服務(wù)(如,上傳1GB文件的請求)
  • 支持大規(guī)?;旌峡蛻舳藨?yīng)用用于連接以萬計(jì)的第三方異步 web 服務(wù)。

WebSockets 實(shí)現(xiàn)

WebSockets 允許雙向,全雙工通信信道,在 TCP socket 中。它被設(shè)計(jì)為允許一個(gè) Web 瀏覽器和 Web 服務(wù)器之間通過數(shù)據(jù)流交互。

WebSocket 協(xié)議已經(jīng)被 IETF 列為 RFC 6455規(guī)范。

Netty 實(shí)現(xiàn)了 RFC 6455 和一些老版本的規(guī)范。請參閱io.netty.handler.codec.http.websocketx包和相關(guān)的例子。

Google Protocol Buffer 整合

Google Protocol Buffers 是快速實(shí)現(xiàn)一個(gè)高效的二進(jìn)制協(xié)議的理想方案。通過使用 ProtobufEncoderProtobufDecoder,你可以把 Google Protocol Buffers 編譯器 (protoc) 生成的消息類放入到 Netty 的codec 實(shí)現(xiàn)中。請參考“LocalTime”實(shí)例,這個(gè)例子也同時(shí)顯示出開發(fā)一個(gè)由簡單協(xié)議定義 的客戶及服務(wù)端是多么的容易。

譯者注:翻譯版本的項(xiàng)目源碼見 https://github.com/waylau/netty-4-user-guide-demos