摘要:解碼器抽象類將字節(jié)解碼為消息或者另一個字節(jié)序列為它提供了一個抽象的基類由于你不可能知道遠(yuǎn)程節(jié)點是否會一次性地發(fā)送一個完整的消息所以這個類會對入站數(shù)據(jù)進(jìn)行緩沖直到它準(zhǔn)備好處理只是將消息進(jìn)行緩沖并不會進(jìn)行解碼操作如何緩沖的下面會說下面這張圖說明
解碼器 ByteToMessageDecoder 抽象類
將字節(jié)解碼為消息(或者另一個字節(jié)序列), Netty 為它提供了一個抽象的基類: ByteToMessageDecoder.
由于你不可能知道遠(yuǎn)程節(jié)點是否會一次性地發(fā)送一個完整的消息, 所以這個類會對入站數(shù)據(jù)進(jìn)行緩沖, 直到它準(zhǔn)備好處理. 只是將消息進(jìn)行緩沖, 并不會進(jìn)行解碼操作. 如何緩沖的下面會說.
下面這張圖說明了在網(wǎng)絡(luò)傳輸中可能出現(xiàn)的情況.
ByteToMessageDecoder 抽象類有兩個重要方法.
方 法 | 描 述 |
---|---|
decode(ChannelHandlerContext ctx,ByteBuf in,List | 必須實現(xiàn)的唯一抽象方法. 方法被調(diào)用時傳入一個包含新數(shù)據(jù)的ByteBuf, 和一個添加解碼消息的List. 對方法的調(diào)用會重復(fù)進(jìn)行, 直到?jīng)]有新元素被添加到List, 或ByteBuf中沒有更多可讀取的字節(jié). 如果List不為空, 它的內(nèi)容會被傳遞給 ChannelPipeline 中的下一個 ChannelInboundHandler. |
decodeLast(ChannelHandlerContext ctx, ByteBuf in, List | 簡單調(diào)用 decode() 方法, 當(dāng) Channel 狀態(tài)為非活動時, 這個方法會被調(diào)用一次. 可以重寫該方法已提供特殊處理. |
cumulation屬性: 用來保存累計讀取到的字節(jié). 我們讀到的新字節(jié)會保存(緩沖)在這里.
cumulator屬性: 用來做累計的. 負(fù)責(zé)將讀到的新字節(jié)寫入 cumulation. 有兩個實現(xiàn) MERGE_CUMULATOR 和 COMPOSITE_CUMULATOR.
singleDecode: 設(shè)置為true后, 單個解碼器只會解碼出一個結(jié)果.
decodeWasNull: 解碼結(jié)果為空.
first: 是否是第一次讀取數(shù)據(jù).
discardAfterReads: 多少次讀取后, 丟棄數(shù)據(jù) 默認(rèn)16次.
numReads: 已經(jīng)累加了多少次數(shù)據(jù)了.
我們實現(xiàn) ByteToMessageDecoder 接口時, 最主要的方法就是 decode, 當(dāng)有新數(shù)據(jù)進(jìn)入時, 會先緩沖數(shù)據(jù)然后將緩沖后的數(shù)據(jù)傳遞給我們.
我們進(jìn)行解碼時, 當(dāng)解碼成功后我們將數(shù)據(jù)放入 decode 方法中的, List 集合中, 這樣就會傳遞給下個 ChannelInboundHandler. 如果解碼失敗就不用操作 List 集合.
就向 io.netty.handler.codec.LineBasedFrameDecoder 實現(xiàn)類中的一樣
@Override protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List編解碼器中的引用計數(shù)
引用計數(shù)需要特別的注意. 對于編碼器和解碼器來說, 其過程也是相當(dāng)?shù)暮唵? 一旦消息被編碼或者解碼, 它就會被 ReferenceCountUtil.release(message)調(diào)用自動釋放. 如果你需要保留引用以便稍后使用, 那么你可以調(diào)用 ReferenceCountUtil.retain(message) 方法. 這將會增加該引用計數(shù), 從而防止該消息被釋放.
MessageToMessageDecoder 抽象類public abstract class MessageToMessageDecoder extends ChannelInboundHandlerAdapter
與 ByteToMessageDecoder 抽象類一樣, 最主要的還是 decode 方法.
decode (ChannelHandlerContext ctx, I msg, List
只不過會將接到的消息強(qiáng)制類型轉(zhuǎn)換為 I, 而且不會對消息進(jìn)行緩沖.
TooLongFrameException 類由于 Netty 是一個異步框架, 所以需要在字節(jié)可以解碼之前在內(nèi)存中緩沖它們. 因此, 不能讓解碼器緩沖大量的數(shù)據(jù)以至于耗盡可用的內(nèi)存. 為了解除這個常見的顧慮, Netty 提供了 TooLongFrameException 類, 其將由解碼器在幀超出指定的大小限制時拋出.
為了避免這種情況, 你可以設(shè)置一個最大字節(jié)數(shù)的閾值, 如果超出該閾值, 則會導(dǎo)致拋出一個 TooLongFrameException (隨后會被 ChannelHandler.exceptionCaught() 方法捕獲). 然后, 如何處理該異常則完全取決于該解碼器的用戶. 某些協(xié)議 (如HTTP) 可能允許你返回一個特殊的響應(yīng). 而在其他的情況下, 唯一的選擇可能就是關(guān)閉對應(yīng)的連接.
public class ToIntegerDecoder extends ByteToMessageDecoder { private static final int MAX_FRAME_SIZE= 1024; @Override public void decode(ChannelHandlerContext ctx, ByteBuf in, List編碼器 MessageToByteEncoder 抽象類
只有一個必須要實現(xiàn)的方法.
encode(ChannelHandlerContext ctx, I msg, ByteBuf out)
encode() 方法是你需要實現(xiàn)的唯一抽象方法. 它被調(diào)用時將會傳入要被該類編碼為 ByteBuf 的 (類型為I的) 出站消息. 該 ByteBuf 隨后將會被轉(zhuǎn)發(fā)給 ChannelPipeline 中的下一個 ChannelOutboundHandler.
這個類只有一個方法, 而解碼器有兩個. 原因是解碼器通常需要在 Channel 關(guān)閉之后產(chǎn)生最后一個消息 (因此也就有了decodeLast()方法). 這顯然不適用于編碼器的場景——在連接被關(guān)閉之后仍然產(chǎn)生一個消息是毫無意義的.
示例, ShortToByteEncoder, 其接受一個 Short 類型的實例作為消息, 將它編碼為 Short 的原子類型值, 并將它寫入 ByteBuf 中, 其將隨后被轉(zhuǎn)發(fā)給 ChannelPipeline 中的下一個 ChannelOutboundHandler. 每個傳出的 Short 值都將會占用 ByteBuf 中的2字節(jié).
public class ShortToByteEncoder extends MessageToByteEncoderMessageToMessageEncoder 抽象類{ @Override public void encode(ChannelHandlerContext ctx, Short msg, ByteBuf out) throws Exception { out.writeShort(msg);//將Short寫入ByteBuf中 } }
encode(ChannelHandlerContext ctx,I msg,List
這是你需要實現(xiàn)的唯一方法. 每個通過 write() 方法寫入的消息都將會被傳遞給 encode() 方法, 以編碼為一個或者多個出站消息. 隨后, 這些出站消息將會被轉(zhuǎn)發(fā)給 ChannelPipeline 中的下一個 ChannelOutboundHandler.
示例, 編碼器將每個出站 Integer 的 String 表示添加到了該 List 中.
public class IntegerToStringEncoder extends MessageToMessageEncoder{ @Override public void encode(ChannelHandlerContext ctx, Integer msg, List
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75091.html
摘要:神經(jīng)網(wǎng)絡(luò)在自然語言處理方面,未來有巨大的應(yīng)用潛力。講座學(xué)者之一與深度學(xué)習(xí)大神蒙特利爾大學(xué)學(xué)者在大會上發(fā)表了論文,進(jìn)一步展現(xiàn)神經(jīng)機(jī)器翻譯的研究結(jié)果。那些指令的語義就是習(xí)得的進(jìn)入嵌入中,來較大化翻譯質(zhì)量,或者模型的對數(shù)似然函數(shù)。 在 8月7日在德國柏林召開的2016 計算語言學(xué)(ACL)大會上,學(xué)者Thang Luong、Kyunghyun Cho 和 Christopher D. Mannin...
摘要:目前用于語義分割研究的兩個最重要數(shù)據(jù)集是和。發(fā)展中的方法效果。論文于年月日提交到主要貢獻(xiàn)將端到端的卷積網(wǎng)絡(luò)推廣到語義分割中重新將預(yù)訓(xùn)練好的網(wǎng)絡(luò)用于分割問題中使用反卷積層進(jìn)行上采樣提出了跳躍連接來改善上采樣的粗糙程度。 語義分割是什么?語義分割方法在處理圖像時,具體到像素級別,也就是說,該方法會將圖像中每個像素分配到某個對象類別。下面是一個具體案例。左邊為輸入圖像,右邊為經(jīng)過語義分割后的輸出圖...
閱讀 3012·2021-11-24 10:22
閱讀 3058·2021-11-23 10:10
閱讀 1367·2021-09-28 09:35
閱讀 1761·2019-08-29 13:16
閱讀 1400·2019-08-26 13:29
閱讀 2798·2019-08-26 10:27
閱讀 687·2019-08-26 10:09
閱讀 1450·2019-08-23 18:05