W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
ChannelHandler的類(lèi)型是有很多的,我們?cè)谇懊娴恼鹿?jié)中已經(jīng)提過(guò)了,而且每個(gè)ChannelHandler需要做什么都取決與它的超類(lèi)。為了能夠讓開(kāi)發(fā)處理邏輯變得簡(jiǎn)單,Netty提供了一些默認(rèn)的處理程序來(lái)實(shí)現(xiàn)形式的“adapter(適配器)”類(lèi)。pipeline 中每個(gè)的 ChannelHandler 主要負(fù)責(zé)轉(zhuǎn)發(fā)事件到鏈中的下一個(gè)處理器。這些適配器類(lèi)(及其子類(lèi))會(huì)自動(dòng)幫你實(shí)現(xiàn),所以你只需要實(shí)現(xiàn)該特定的方法和事件。
為什么用適配器?
有幾個(gè)適配器類(lèi),可以減少編寫(xiě)自定義 ChannelHandlers ,因?yàn)樗麄兲峁?duì)應(yīng)接口的所有方法的默認(rèn)實(shí)現(xiàn)。(也有類(lèi)似的適配器,用于創(chuàng)建編碼器和解碼器,這我們將在稍后討論。)這些都是創(chuàng)建自定義處理器時(shí),會(huì)經(jīng)常調(diào)用的適配器:ChannelHandlerAdapter、ChannelInboundHandlerAdapter、ChannelOutboundHandlerAdapter、ChannelDuplexHandlerAdapter
下面解釋下三個(gè) ChannelHandler 的子類(lèi)型:編碼器、解碼器以及 ChannelInboundHandlerAdapter 的子類(lèi)SimpleChannelInboundHandler
當(dāng)您發(fā)送或接收消息時(shí),Netty 數(shù)據(jù)轉(zhuǎn)換就發(fā)生了。入站消息將從字節(jié)轉(zhuǎn)為一個(gè)Java對(duì)象;也就是說(shuō),“解碼”。如果該消息是出站相反會(huì)發(fā)生:“編碼”,從一個(gè)Java對(duì)象轉(zhuǎn)為字節(jié)。其原因是簡(jiǎn)單的:網(wǎng)絡(luò)數(shù)據(jù)是一系列字節(jié),因此需要從那類(lèi)型進(jìn)行轉(zhuǎn)換。
不同類(lèi)型的抽象類(lèi)用于提供編碼器和解碼器的,這取決于手頭的任務(wù)。例如,應(yīng)用程序可能并不需要馬上將消息轉(zhuǎn)為字節(jié)。相反,該??消息將被轉(zhuǎn)換 一些其他格式。一個(gè)編碼器將仍然可以使用,但它也將衍生自不同的超類(lèi),
在一般情況下,基類(lèi)將有一個(gè)名字類(lèi)似 ByteToMessageDecoder 或 MessageToByteEncoder。在一種特殊類(lèi)型的情況下,你可能會(huì)發(fā)現(xiàn)類(lèi)似 ProtobufEncoder 和 ProtobufDecoder,用于支持谷歌的 protocol buffer。
嚴(yán)格地說(shuō),其他處理器可以做編碼器和解碼器能做的事。但正如適配器類(lèi)簡(jiǎn)化創(chuàng)建通道處理器,所有的編碼器/解碼器適配器類(lèi) 都實(shí)現(xiàn)自 ChannelInboundHandler 或 ChannelOutboundHandler。
對(duì)于入站數(shù)據(jù),channelRead 方法/事件被覆蓋。這種方法在每個(gè)消息從入站 Channel 讀入時(shí)調(diào)用。該方法將調(diào)用特定解碼器的“解碼”方法,并將解碼后的消息轉(zhuǎn)發(fā)到管道中下個(gè)的 ChannelInboundHandler。
出站消息是類(lèi)似的。編碼器將消息轉(zhuǎn)為字節(jié),轉(zhuǎn)發(fā)到下個(gè)的 ChannelOutboundHandler。
也許最常見(jiàn)的處理器是接收到解碼后的消息并應(yīng)用一些業(yè)務(wù)邏輯到這些數(shù)據(jù)。要?jiǎng)?chuàng)建這樣一個(gè) ChannelHandler,你只需要擴(kuò)展基類(lèi)SimpleChannelInboundHandler
在這種類(lèi)型的處理器方法中的最重要是 channelRead0(ChannelHandlerContext,T)。在這個(gè)調(diào)用中,T 是將要處理的消息。 你怎么做,完全取決于你,但無(wú)論如何你不能阻塞 I/O線程,因?yàn)檫@可能是不利于高性能。
阻塞操作
I/O 線程一定不能完全阻塞,因此禁止任何直接阻塞操作在你的 ChannelHandler, 有一種方法來(lái)實(shí)現(xiàn)這一要求。你可以指定一個(gè) EventExecutorGroup。當(dāng)添加 ChannelHandler 到ChannelPipeline。此 EventExecutorGroup 將用于獲得EventExecutor,將執(zhí)行所有的 ChannelHandler 的方法。這EventExecutor 將從 I/O 線程使用不同的線程,從而釋放EventLoop。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: