Netty的Encoder(編碼器)

2018-08-08 10:40 更新

在之前的章節(jié)中,我們對encoder有了定義,它是用來把出站數(shù)據(jù)從一種格式轉(zhuǎn)換到另外一種格式,因此它實(shí)現(xiàn)了 ChanneOutboundHandler 。就像decoder一樣,Netty 也為你提供了一組類來寫 encoder ,當(dāng)然這些類提供的是與 decoder 完全相反的方法,如下所示:

  • 編碼從消息到字節(jié)
  • 編碼從消息到消息

MessageToByteEncoder

之前我們學(xué)習(xí)了如何使用 ByteToMessageDecoder 來將字節(jié)轉(zhuǎn)換成消息,現(xiàn)在我們使用 MessageToByteEncoder 實(shí)現(xiàn)相反的效果。

Table 7.3 MessageToByteEncoder API

方法名稱描述
encodeThe 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.

這個(gè)類只有一個(gè)方法,而 decoder 卻是有兩個(gè),原因就是 decoder 經(jīng)常需要在 Channel 關(guān)閉時(shí)產(chǎn)生一個(gè)“最后的消息”。出于這個(gè)原因,提供了decodeLast(),而 encoder 沒有這個(gè)需求。

下面示例,我們想產(chǎn)生 Short 值,并想將他們編碼成 ByteBuf 來發(fā)送到 線上,我們提供了 ShortToByteEncoder 來實(shí)現(xiàn)該目的。

Figure%207

Figure 7.3 ShortToByteEncoder

上圖展示了,encoder 收到了 Short 消息,編碼他們,并把他們寫入 ByteBuf。 ByteBuf 接著前進(jìn)到下一個(gè) pipeline 的ChannelOutboundHandler。每個(gè) Short 將占用 ByteBuf 的兩個(gè)字節(jié)

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. 實(shí)現(xiàn)繼承自 MessageToByteEncoder
  2. 寫 Short 到 ByteBuf

Netty 提供很多 MessageToByteEncoder 類來幫助你的實(shí)現(xiàn)自己的 encoder 。其中 WebSocket08FrameEncoder 就是個(gè)不錯(cuò)的范例??梢栽?io.netty.handler.codec.http.websocketx 包找到。

MessageToMessageEncoder

我們已經(jīng)知道了如何將入站數(shù)據(jù)從一個(gè)消息格式解碼成另一個(gè)格式?,F(xiàn)在我們需要一種方法來將出站數(shù)據(jù)從一種消息編碼成另一種消息。MessageToMessageEncoder 提供此功能,見表7.4,同樣的只有一個(gè)方法,因?yàn)椴恍枰a(chǎn)生“最后的消息”。

Table 7.4 MessageToMessageEncoder API

方法名稱描述
encodeThe 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%207

Figure 7.4 IntegerToStringEncoder

encoder 從出站字節(jié)流提取 Integer,以 String 形式傳遞給ChannelPipeline 中的下一個(gè) ChannelOutboundHandler 。清單7.6 顯示了細(xì)節(jié)。

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. 實(shí)現(xiàn)繼承自 MessageToMessageEncoder
  2. 轉(zhuǎn) Integer 為 String,并添加到 MessageBuf

更復(fù)雜 的 MessageToMessageEncoder 應(yīng)用案例,可以查看 io.netty.handler.codec.protobuf 包下的 ProtobufEncoder


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號