# Encoder(編碼器)
回顧之前的定義,encoder 是用來把出站數據從一種格式轉換到另外一種格式,因此它實現了 ChanneOutboundHandler 。正如你所期望的一樣,類似于 decoder,Netty 也提供了一組類來幫助你寫 encoder,當然這些類提供的是與 decoder 相反的方法,如下所示:
- 編碼從消息到字節
- 編碼從消息到消息
### MessageToByteEncoder
之前我們學習了如何使用 ByteToMessageDecoder 來將字節轉換成消息,現在我們使用 MessageToByteEncoder 實現相反的效果。
Table 7.3 MessageToByteEncoder API
| 方法名稱 | 描述 |
|-----|-----|
| encode | The encode method is the only abstract method you need to implement. It is called with the outbound message, which this class will encodes to a ByteBuf. The ByteBuf is then forwarded to the next ChannelOutboundHandler in the ChannelPipeline. |
這個類只有一個方法,而 decoder 卻是有兩個,原因就是 decoder 經常需要在 Channel 關閉時產生一個“最后的消息”。出于這個原因,提供了decodeLast(),而 encoder 沒有這個需求。
下面示例,我們想產生 Short 值,并想將他們編碼成 ByteBuf 來發送到 線上,我們提供了 ShortToByteEncoder 來實現該目的。

Figure 7.3 ShortToByteEncoder
上圖展示了,encoder 收到了 Short 消息,編碼他們,并把他們寫入 ByteBuf。 ByteBuf 接著前進到下一個 pipeline 的ChannelOutboundHandler。每個 Short 將占用 ByteBuf 的兩個字節
Listing 7.5 ShortToByteEncoder encodes shorts into a ByteBuf
~~~
public class ShortToByteEncoder extends
MessageToByteEncoder<Short> { //1
@Override
public void encode(ChannelHandlerContext ctx, Short msg, ByteBuf out)
throws Exception {
out.writeShort(msg); //2
}
}
~~~
1. 實現繼承自 MessageToByteEncoder
1. 寫 Short 到 ByteBuf
Netty 提供很多 MessageToByteEncoder 類來幫助你的實現自己的 encoder 。其中 WebSocket08FrameEncoder 就是個不錯的范例。可以在 io.netty.handler.codec.http.websocketx 包找到。
### MessageToMessageEncoder
我們已經知道了如何將入站數據從一個消息格式解碼成另一個格式。現在我們需要一種方法來將出站數據從一種消息編碼成另一種消息。MessageToMessageEncoder 提供此功能,見表7.4,同樣的只有一個方法,因為不需要產生“最后的消息”。
Table 7.4 MessageToMessageEncoder API
| 方法名稱 | 描述 |
|-----|-----|
| encode | The encode method is the only abstract method you need to implement. It is called for each message written with write(...) to encode the message to one or multiple new outbound messages. The encoded messages are then forwarded |
下面例子,我們將要解碼 Integer 消息到 String 消息。可簡單使用 MessageToMessageEncoder

Figure 7.4 IntegerToStringEncoder
encoder 從出站字節流提取 Integer,以 String 形式傳遞給ChannelPipeline 中的下一個 ChannelOutboundHandler 。清單7.6顯示了細節。
Listing 7.6 IntegerToStringEncoder encodes integer to string
~~~
public class IntegerToStringEncoder extends
MessageToMessageEncoder<Integer> { //1
@Override
public void encode(ChannelHandlerContext ctx, Integer msg, List<Object> out)
throws Exception {
out.add(String.valueOf(msg)); //2
}
}
~~~
1. 實現繼承自 MessageToMessageEncoder
1. 轉 Integer 為 String,并添加到 MessageBuf
更復雜 的 MessageToMessageEncoder 應用案例,可以查看 io.netty.handler.codec.protobuf 包下的 ProtobufEncoder
- Introduction
- 開始
- Netty-異步和數據驅動
- Netty 介紹
- 構成部分
- 關于本書
- 第一個 Netty 應用
- 設置開發環境
- Netty 客戶端/服務端 總覽
- 寫一個 echo 服務器
- 寫一個 echo 客戶端
- 編譯和運行 Echo 服務器和客戶端
- 總結
- Netty 總覽
- Netty 快速入門
- Channel, Event 和 I/O
- 什么是 Bootstrapping 為什么要用
- ChannelHandler 和 ChannelPipeline
- 近距離觀察 ChannelHandler
- 總結
- 核心功能
- Transport(傳輸)
- 案例研究:Transport 的遷移
- Transport API
- 包含的 Transport
- Transport 使用情況
- 總結
- Buffer(緩沖)
- Buffer API
- ByteBuf - 字節數據的容器
- 字節級別的操作
- ByteBufHolder
- ByteBuf 分配
- 總結
- ChannelHandler 和 ChannelPipeline
- ChannelHandler 家族
- ChannelPipeline
- ChannelHandlerContext
- 總結
- Codec 框架
- 什么是 Codec
- Decoder(解碼器)
- Encoder(編碼器)
- 抽象 Codec(編解碼器)類
- 總結
- 提供了的 ChannelHandler 和 Codec
- 使用 SSL/TLS 加密 Netty 程序
- 構建 Netty HTTP/HTTPS 應用
- 空閑連接以及超時
- 解碼分隔符和基于長度的協議
- 編寫大型數據
- 序列化數據
- 總結
- Bootstrap 類型
- 引導客戶端和無連接協議
- 引導服務器
- 從 Channel 引導客戶端
- 在一個引導中添加多個 ChannelHandler
- 使用Netty 的 ChannelOption 和屬性
- 關閉之前已經引導的客戶端或服務器
- 總結
- 引導
- Bootstrap 類型
- 引導客戶端和無連接協議
- 引導服務器
- 從 Channel 引導客戶端
- 在一個引導中添加多個 ChannelHandler
- 使用Netty 的 ChannelOption 和屬性
- 關閉之前已經引導的客戶端或服務器
- 總結
- NETTY BY EXAMPLE
- 單元測試
- 總覽
- 測試 ChannelHandler
- 測試異常處理
- 總結
- WebSocket
- WebSocket 程序示例
- 添加 WebSocket 支持
- 測試程序
- 總結
- SPDY
- SPDY 背景
- 示例程序
- 實現
- 啟動 SpdyServer 并測試
- 總結
- 通過 UDP 廣播事件
- UDP 基礎
- UDP 廣播
- UDP 示例
- EventLog 的 POJO
- 寫廣播器
- 寫監視器
- 運行 LogEventBroadcaster 和 LogEventMonitor
- 總結
- 高級主題
- 實現自定義的編解碼器
- 編解碼器的范圍
- 實現 Memcached 編解碼器
- 了解 Memcached 二進制協議
- Netty 編碼器和解碼器
- 測試編解碼器
- EventLoop 和線程模型
- 線程模型的總覽
- EventLoop
- EventLoop
- I/O EventLoop/Thread 分配細節
- 總結
- 用例1:Droplr Firebase 和 Urban Airship
- 用例2:Facebook 和 Twitter