99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

近距離觀察Netty的ChannelHandler

2018-08-02 15:31 更新

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。

SimpleChannelHandler

也許最常見(jiàn)的處理器是接收到解碼后的消息并應(yīng)用一些業(yè)務(wù)邏輯到這些數(shù)據(jù)。要?jiǎng)?chuàng)建這樣一個(gè) ChannelHandler,你只需要擴(kuò)展基類(lèi)SimpleChannelInboundHandler 其中 T 是想要進(jìn)行處理的類(lèi)型。這樣的處理器,你將覆蓋基類(lèi)的一個(gè)或多個(gè)方法,將獲得被作為輸入?yún)?shù)傳遞所有方法的 ChannelHandlerContext 的引用。

在這種類(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。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)