W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在之前的章節(jié)中,我們對encoder有了定義,它是用來把出站數(shù)據(jù)從一種格式轉(zhuǎn)換到另外一種格式,因此它實(shí)現(xiàn)了 ChanneOutboundHandler 。就像decoder一樣,Netty 也為你提供了一組類來寫 encoder ,當(dāng)然這些類提供的是與 decoder 完全相反的方法,如下所示:
之前我們學(xué)習(xí)了如何使用 ByteToMessageDecoder 來將字節(jié)轉(zhuǎn)換成消息,現(xiàn)在我們使用 MessageToByteEncoder 實(shí)現(xiàn)相反的效果。
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. |
這個(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 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
}
}
Netty 提供很多 MessageToByteEncoder 類來幫助你的實(shí)現(xiàn)自己的 encoder 。其中 WebSocket08FrameEncoder 就是個(gè)不錯(cuò)的范例??梢栽?io.netty.handler.codec.http.websocketx 包找到。
我們已經(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
方法名稱 | 描述 |
---|---|
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 從出站字節(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
}
}
更復(fù)雜 的 MessageToMessageEncoder 應(yīng)用案例,可以查看 io.netty.handler.codec.protobuf 包下的 ProtobufEncoder
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: