一、前言
前面已經(jīng)學(xué)習(xí)完了Netty框架中的主要組件,接著學(xué)習(xí)codec框架。
二、codec框架
每個(gè)網(wǎng)絡(luò)應(yīng)用程序必須定義如何將在對(duì)等體之間傳輸?shù)脑甲止?jié)解析并轉(zhuǎn)換為目標(biāo)程序的數(shù)據(jù)格式,這種轉(zhuǎn)換邏輯有codec處理,其由編碼器和解碼器組成,每個(gè)編碼器和解碼器將字節(jié)流從一種格式轉(zhuǎn)換到另一種格式。若將消息視為具有特定意義的結(jié)構(gòu)化字節(jié)序列,那么編碼器將該消息轉(zhuǎn)換成適合于傳輸?shù)母袷剑ê芸赡苁亲止?jié)流),反之,解碼器將網(wǎng)絡(luò)流轉(zhuǎn)換回應(yīng)用程序的消息格式,然后,編碼器處理出站數(shù)據(jù),解碼器處理入站數(shù)據(jù)。
2.1 解碼器
解碼器類涵蓋兩個(gè)不同的使用用例。
· 將字節(jié)解碼為消息 - ByteToMessageDecoder和ReplayingDecoder。
· 將一個(gè)消息類型解碼為另一個(gè) - MessageToMessageDecoder。
解碼器負(fù)責(zé)將入站數(shù)據(jù)從一種格式轉(zhuǎn)換到另一種格式,所以Netty的解碼器實(shí)現(xiàn)了ChannelInboundHandler接口。當(dāng)需要在ChannelPipeline中為下一個(gè)ChannelInboundHandler轉(zhuǎn)換入站數(shù)據(jù)時(shí)需要使用解碼器。由于Netty支持代碼模塊化和重用,因此可以鏈接多個(gè)解碼器來(lái)實(shí)現(xiàn)任意復(fù)雜的轉(zhuǎn)換邏輯。
1. ByteToMessageDecoder抽象類
從字節(jié)到消息(或另一個(gè)字節(jié)序列)的解碼是一個(gè)常見(jiàn)的任務(wù),Netty使用ByteToMessageDecoder抽象類完成該任務(wù),由于無(wú)法知道遠(yuǎn)程對(duì)等體是否一次發(fā)送完整的消息,因此該類會(huì)緩沖入站數(shù)據(jù),直到所有待處理的數(shù)據(jù)已經(jīng)準(zhǔn)備好。
假設(shè)你收到一個(gè)包含簡(jiǎn)單int的字節(jié)流,每個(gè)int都要單獨(dú)處理。 此時(shí)將從入站ByteBuf讀取每個(gè)int,并將其傳遞給下一個(gè)ChannelInboundHandler。而為解碼字節(jié)流,需要擴(kuò)展ByteToMessageDecoder(當(dāng)int添加到List時(shí),它將自動(dòng)裝箱到Integer類型),整個(gè)過(guò)程如下圖所示。
一次從ByteBuf中讀取四個(gè)字節(jié)解析成一個(gè)int類型,并添加到List中,當(dāng)讀取完成后,將會(huì)被傳遞至下個(gè)ChannelHandler中,下面是ToIntegerDecoder的源代碼。
網(wǎng)友評(píng)論