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