一、前言

  前面已經(jīng)學(xué)習(xí)完了Netty框架中的主要組件,接著學(xué)習(xí)codec框架。

二、codec框架

  每個網(wǎng)絡(luò)應(yīng)用程序必須定義如何將在對等體之間傳輸?shù)脑甲止?jié)解析并轉(zhuǎn)換為目標程序的數(shù)據(jù)格式,這種轉(zhuǎn)換邏輯有codec處理,其由編碼器和解碼器組成,每個編碼器和解碼器將字節(jié)流從一種格式轉(zhuǎn)換到另一種格式。若將消息視為具有特定意義的結(jié)構(gòu)化字節(jié)序列,那么編碼器將該消息轉(zhuǎn)換成適合于傳輸?shù)母袷剑ê芸赡苁亲止?jié)流),反之,解碼器將網(wǎng)絡(luò)流轉(zhuǎn)換回應(yīng)用程序的消息格式,然后,編碼器處理出站數(shù)據(jù),解碼器處理入站數(shù)據(jù)。

  2.1 解碼器

  解碼器類涵蓋兩個不同的使用用例。

    · 將字節(jié)解碼為消息 - ByteToMessageDecoder和ReplayingDecoder。

    · 將一個消息類型解碼為另一個 - MessageToMessageDecoder。

  解碼器負責(zé)將入站數(shù)據(jù)從一種格式轉(zhuǎn)換到另一種格式,所以Netty的解碼器實現(xiàn)了ChannelInboundHandler接口。當需要在ChannelPipeline中為下一個ChannelInboundHandler轉(zhuǎn)換入站數(shù)據(jù)時需要使用解碼器。由于Netty支持代碼模塊化和重用,因此可以鏈接多個解碼器來實現(xiàn)任意復(fù)雜的轉(zhuǎn)換邏輯。

  1. ByteToMessageDecoder抽象類

  從字節(jié)到消息(或另一個字節(jié)序列)的解碼是一個常見的任務(wù),Netty使用ByteToMessageDecoder抽象類完成該任務(wù),由于無法知道遠程對等體是否一次發(fā)送完整的消息,因此該類會緩沖入站數(shù)據(jù),直到所有待處理的數(shù)據(jù)已經(jīng)準備好。

  假設(shè)你收到一個包含簡單int的字節(jié)流,每個int都要單獨處理。 此時將從入站ByteBuf讀取每個int,并將其傳遞給下一個ChannelInboundHandler。而為解碼字節(jié)流,需要擴展ByteToMessageDecoder(當int添加到List時,它將自動裝箱到Integer類型),整個過程如下圖所示。

  平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

  一次從ByteBuf中讀取四個字節(jié)解析成一個int類型,并添加到List中,當讀取完成后,將會被傳遞至下個ChannelHandler中,下面是ToIntegerDecoder的源代碼。 

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負責(zé)任的教育,學(xué)習(xí)改變命運,軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式