netty in action中文版第七章編解碼器codec_第1頁
netty in action中文版第七章編解碼器codec_第2頁
netty in action中文版第七章編解碼器codec_第3頁
免費預覽已結(jié)束,剩余4頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、NettyInAction器-1. 器器器總3. 4. 器1. byte-to-byte器5. 其他方1. 器器器框架以及7.1 器器的作用就是講原始字節(jié)數(shù)據(jù)與自定義的消息對象進行互轉(zhuǎn)。網(wǎng)絡(luò)中都是器由兩部分組成器器負責將消息從字節(jié)或其他序列形式轉(zhuǎn)成指定的消息對象,則相反器負責處理“入站”數(shù)據(jù)負責處理“出站器的結(jié)構(gòu)很簡單,消息被編碼后會自動通過數(shù)據(jù)。和,如果不消息以使用essage),這將會數(shù)量增加而沒有消息發(fā)布,大多數(shù)時候不需要這么做NettyInAction器-1. 器器器總3. 4. 器1. byte-to-byte器5. 其他方1. 器器器框架以及7.1 器器的作用就是講原始字節(jié)數(shù)據(jù)與自

2、定義的消息對象進行互轉(zhuǎn)。網(wǎng)絡(luò)中都是器由兩部分組成器器負責將消息從字節(jié)或其他序列形式轉(zhuǎn)成指定的消息對象,則相反器負責處理“入站”數(shù)據(jù)負責處理“出站器的結(jié)構(gòu)很簡單,消息被編碼后會自動通過數(shù)據(jù)。和,如果不消息以使用essage),這將會數(shù)量增加而沒有消息發(fā)布,大多數(shù)時候不需要這么做器的一個類型字節(jié)到消消息到消消息到字本章將概述不同的抽象基類,來幫助了器的實現(xiàn)。深入了解Netty提供器之前先了器的作用是什么器負“入站”數(shù)據(jù)從一種格式到另一種格器處理入站數(shù)據(jù)是抽象ChannelInboundHandler的實現(xiàn)。實踐中使器很簡單,就是入站數(shù)據(jù)轉(zhuǎn)換格式后傳遞到ChannelPipeline中的下一個Cha

3、nnelInboundHandler進行處理;這樣的處理時很靈活的器在ChannelPipeline中,重用邏輯7.2.1 通常你需要將消息從字成消息或者從字成其他的序列化字節(jié)。這是一個常見的任務(wù),Netty提供了抽象基類可使用它們來實現(xiàn)。Netty中提供的ByteToMessageDecoder可以將字節(jié)成POJO對象,下面列出了ByteToMessageDecoder兩個要方法decode(ChannelHandlerContext, ByteBuf, List),這個方法是唯一的一個需要自己實現(xiàn)的抽象方法,作用是將ByteBuf據(jù)成其他形式的數(shù)據(jù)ast(ChannelHandlerCon

4、text, ByteBuf, List),實際上調(diào)用的是decode(.)上圖顯示了從“入站,然后*器,ByteToMessageDecoder實* author *public class egerDecoder extends ByteToMessageDecoder 上圖顯示了從“入站,然后*器,ByteToMessageDecoder實* author *public class egerDecoder extends ByteToMessageDecoder protected void decode(ChannelHandlerContext ctx, ByteBuf in, Li

5、st out) throws Exception ytes() = 從上面的代碼可能會發(fā)現(xiàn)需要檢查ByteBuf讀之前是否有足夠的字節(jié),若沒有這個檢查豈不更好?是的,Netty提供了這樣的處理許byte-to-,在下一節(jié)講解。除了ByteToMessageDecoder之外,Netty還提供了許多其他接口7.2.2 ReplayingDecoder是byte-to-的一種特殊的抽象基類緩沖區(qū)的數(shù)據(jù)之前需要檢查緩沖區(qū)是否有足夠的字節(jié),用ReplayingDecoder就無需自己檢查;若ByteBuf中有足夠的字節(jié),則會正;若沒有足夠的字節(jié)則會停。也正因為這樣的裝使得ReplayingDecode

6、r帶有一定的局限性ytes()大部分時間不會返回期望使*器,ReplayingDecoder實* author *public class egerReplayingDecoder extends ReplayingDecoder protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception 當從接收的數(shù)據(jù),若有足夠的字節(jié)可讀,則數(shù)據(jù)添加7.2.3 message同上面講的byte-to-message的處理機制一樣,看下圖器是用來處理入站數(shù)據(jù),Netty提供了很器的實現(xiàn),可以根據(jù)

7、需求詳細了解。發(fā)送數(shù)據(jù)需器是用來處理入站數(shù)據(jù),Netty提供了很器的實現(xiàn),可以根據(jù)需求詳細了解。發(fā)送數(shù)據(jù)需要將數(shù)據(jù)編碼,Netty也提供了的支持。下一節(jié)將講解如何實現(xiàn)。7.3 可以很簡單的7.3.1 * 將接收eger消息轉(zhuǎn)成String類型,MessageToMessageDecoder實* author *public egerToStringDecoder extends eger protected void decode(ChannelHandlerContext eger msg, List out) throws Exception * ,eger值編碼成byte,Message

8、ToByteEncoder實* author * public egerToByteEncoder extends eger protected void encode(ChannelHandlerContexteger msg, ByteBuf out) throws Exception 7.3.2 * ,eger編碼成String,MessageToMessageEncoder實* ,eger值編碼成byte,MessageToByteEncoder實* author * public egerToByteEncoder extends eger protected void encode

9、(ChannelHandlerContexteger msg, ByteBuf out) throws Exception 7.3.2 * ,eger編碼成String,MessageToMessageEncoder實* author *public egerToStringEncoder extends eger protected void encode(ChannelHandlerContext eger msg, List out) throws 7.4 器操作封裝太一個類中處理“入站”數(shù)據(jù),編碼處理“出站”數(shù)據(jù)。知道了編碼和器或考慮到這一點抽象類7.4.1 byte-to-byte考

10、慮到這一點抽象類7.4.1 byte-to-bytebyte array = new public class ByteArrayEncoder extends MessageToMessageEncoder protected void encode(ChannelHandlerContext ctx, byte msg, List out) throws Exception ByteoessaeCoec用來處理yte-to-essae和essae-to-yte。如果想要字節(jié)消息PJ或編碼PJ消息成字節(jié),于這種情況ByteoessaeCoec是一個不錯的擇。ByteoessaeCoec是一種

11、組合其等同yteoessaeDecoer和 essaeoBytecoe的組合。essaeoByteEcoer是個抽象類,其中有2個方法需要己實現(xiàn):encode(ChannelHandlerContext, I, ByteBuf),編碼 decode(ChannelHandlerContext, ByteBuf, List),MessageToMessageEncoder的組合體。MessageToMessageCodec是抽象類,其中有2個方法需自己實現(xiàn)encode(ChannelHandlerContext, OUTBOUND_IN, List) decode(ChannelHandlerC

12、ontext, INBOUND_IN, List)但是,這種器能有用嗎packageimportimport import import import import import import import import import importpublic class ndler MessageToMessageCodecWebSocketFrame, publicicfinalndlerINSTANCE=newmsg.getBytes(0,array); public class ByteArrayDecoder extends MessageToMessageDecoder prote

13、cted void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception / copy the ByteBuf content to a byte protected void encode(ChannelHandlerContextprotected void encode(ChannelHandlerContext ctx, MyWebSocketFrame msg, List out) throws Exception switch (msg.getType() case out.add(new

14、 case out.add(new CloseWebSocketFrame(true, 0, case out.add(new case out.add(new case out.add(new throw new eException(Unsupported websocket msg + protected void decode(ChannelHandlerContext ctx, WebSocketFrame msg, List out) throws Exception if (msg instanceof BinaryWebSocketFrame) out.add(new MyWe

15、bSocketFrame(MyWebSocketFrame.FrameType.BINARY, if (msg instanceof CloseWebSocketFrame) out.add(new MyWebSocketFrame(MyWebSocketFrame.FrameType.CLOSE, if (msg WebSocketFrame) out.add(new NG, if (msg instanceof PongWebSocketFrame) out.add(new MyWebSocketFrame(MyWebSocketFrame.FrameType.PONG, if (msg

16、instanceof TextWebSocketFrame) out.add(new MyWebSocketFrame(MyWebSocketFrame.FrameType.TEXT, if (msg instanceof ContinuationWebSocketFrame) out.add(new MyWebSocketFrame(MyWebSocketFrame.FrameType.CONTINUATION, throw new eException(Unsupported websocket msg + public ic final class MyWebSocketFrame pu

17、blic enum FrameType BINARY, PONG, TEXT, private final FrameType private final ByteBuf public MyWebSocketFrame(FrameType type, ByteBuf data) this.type = this.data = public FrameType getType() return public ByteBuf getData() return 7.5 其他使用方器來充當和器的組合失去了單獨使用或器的靈活性器是要么都有要么都沒有。你可能知道是否有解決這問題的方式,還可以讓和器在Cha

18、nnelPipeline中作為一個邏輯單7.5 其他使用方器來充當和器的組合失去了單獨使用或器的靈活性器是要么都有要么都沒有。你可能知道是否有解決這問題的方式,還可以讓和器在ChannelPipeline中作為一個邏輯單元。幸運的是,Netty提供了一種決方案,使用CombinedChannelDuplexHandler。雖然這個類不是器API的一部分,但是它經(jīng)常被用來簡歷一個7.5.1 器RTSP(Real Time Streaming Protocol,實時流傳輸協(xié)議),在ty.handler.codec.rtspSCTP(Stream Control * 繼承CombinedChannelDuplexHandler,用于綁器和* author *public class CharCodec extends CombinedChannelDuplexHandler public super(new ByteToCharDecoder(), new * ,將char轉(zhuǎn)成* author *public class CharToByteEncoder exte

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論