成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

還有這種好事!netty自帶http2的編碼解碼器framecodec

不知名網(wǎng)友 / 765人閱讀

摘要:事實(shí)上也是繼承自。它的主要作用是將中的和對象進(jìn)行映射。的生命周期的生命周期將會向有效的發(fā)送和寫入。對于一個有效的來說,如果任意一方發(fā)送一個,那么該就會被關(guān)閉。

簡介

netty為我們提供了很多http2的封裝,讓我們可以輕松的搭建出一個支持http2的服務(wù)器。其中唯一需要我們自定義的就是http2 handler。

在之前的文章中,我們介紹了自定義http2handler繼承自Http2ConnectionHandler并且實(shí)現(xiàn)Http2FrameListener。這種實(shí)現(xiàn)方式是netty目前比較推薦的實(shí)現(xiàn)方式,今天給大家介紹的一種實(shí)現(xiàn)方式是netty中準(zhǔn)備替換繼承Http2ConnectionHandler的實(shí)現(xiàn)方式,但是這種實(shí)現(xiàn)方式并不成熟,還在不斷的完善中。

今天給大家介紹一下這種實(shí)現(xiàn)方式。

Http2FrameCodec

這種實(shí)現(xiàn)方式的核心類是Http2FrameCodec。事實(shí)上Http2FrameCodec也是繼承自Http2ConnectionHandler。

它的主要作用是將HTTP/2中的frames和Http2Frame對象進(jìn)行映射。Http2Frame是netty中對應(yīng)所有http2 frame的封裝,這樣就可以在后續(xù)的handler中專注于處理Http2Frame對象即可,從而擺脫了http2協(xié)議的各種細(xì)節(jié),可以減少使用者的工作量。

對于每個進(jìn)入的HTTP/2 frame,Http2FrameCodec都會創(chuàng)建一個Http2Frame對象,并且將其傳遞給channelRead方法,用于對該對象進(jìn)行處理。

通過調(diào)用write方法,可以對outbound的 Http2Frame 轉(zhuǎn)換成為http2 frame的格式。

Http2Frame、Http2FrameStream和Http2StreamFrame

netty中有三個非常類似的類,他們是Http2Frame、Http2FrameStream和Http2StreamFrame。

我們知道netty中一個tcp連接可以建立多個stream,Http2FrameStream就是和stream對應(yīng)的類,這個類中包含了stream的id和stream當(dāng)前的狀態(tài)。

一個stream中又包含了多個消息,每個消息都是由多個frame組成的,所以Http2Frame是和這些frame對應(yīng)的netty類。

Http2StreamFrame本身也是一個frame,事實(shí)上它繼承自Http2Frame。

為什么會有這個類呢?因?yàn)閷?yīng)frame本身來說,一般情況下它是和一個特定的stream相關(guān)聯(lián)的,Http2StreamFrame表示這種關(guān)聯(lián)關(guān)系,可以通過它的set stream方法來指定其關(guān)聯(lián)的stream。如果想要該frame應(yīng)用到整個連接而不是特定的某個stream,如果是關(guān)聯(lián)到整個連接,那么stream()方法的返回就是null。

Http2FrameCodec的構(gòu)造

雖然Http2FrameCodec有構(gòu)造函數(shù),但是netty推薦使用Http2FrameCodecBuilder來構(gòu)造它:

Http2FrameCodecBuilder.forServer().build();

可以看到Http2FrameCodecBuilder有一個forServer還有一個forClient方法。他們一個是使用在服務(wù)器端,一個是使用在客戶端。

主要是通過里面的server屬性來進(jìn)行區(qū)分。

Stream的生命周期

frame codec將會向有效的stream發(fā)送和寫入frames。之前講過了 Http2StreamFrame 是和一個Http2FrameStream對象相關(guān)聯(lián)的。

對于一個有效的stream來說,如果任意一方發(fā)送一個RST_STREAM frame,那么該stream就會被關(guān)閉。

或者發(fā)送方或者接收方任意一方發(fā)送的frame中帶有END_STREAM標(biāo)記,該stream也會被關(guān)閉。

流控制

Http2FrameCodec提供了對流的自動控制,但是我們?nèi)匀恍枰鲆恍┎僮?,來對window進(jìn)行更新。

具體而言,當(dāng)我們在接收到Http2DataFrame消息的時候,對消息進(jìn)行處理之后,需要增大window的大小,表示該data已經(jīng)被處理了,可以有更多的空間去容納新的數(shù)據(jù)。

也就是說需要向ctx中寫入一個Http2WindowUpdateFrame,在這個Http2WindowUpdateFrame中需要傳入處理的data的大小和對應(yīng)stream的id,下面是一個處理data frame的例子:

    /**     * 處理data frame消息     */    private static void onDataRead(ChannelHandlerContext ctx, Http2DataFrame data){        Http2FrameStream stream = data.stream();        if (data.isEndStream()) {            sendResponse(ctx, stream, data.content());        } else {            // 不是end stream不發(fā)送,但是需要釋放引用            data.release();        }        // 處理完data,需要更新window frame,增加處理過的Data大小        ctx.write(new DefaultHttp2WindowUpdateFrame(data.initialFlowControlledBytes()).stream(stream));    }

上的例子中,我們向DefaultHttp2WindowUpdateFrame傳入了對應(yīng)的stream id,如果stream id為0,則表示處理的是整個connection,而不是多帶帶的某個stream。

除了window update frame之外,對于某個特定stream的初始window還可以發(fā)送一個 Http2SettingsFrame,通過設(shè)置Http2Settings.initialWindowSize() 達(dá)到初始化的目的。

接收消息

對于每個HTTP/2 stream來說,其中包含的frame可以分為 Http2HeadersFrame和Http2DataFrame,而Http2HeadersFrame必定是第一個接收到的frame,并且這個headerFrame還關(guān)聯(lián)了對應(yīng)的stream對象:Http2FrameStream。

所以我們在處理的時候可以針對這兩種不同的frame分別進(jìn)行處理:

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {        if (msg instanceof Http2HeadersFrame) {            onHeadersRead(ctx, (Http2HeadersFrame) msg);        } else if (msg instanceof Http2DataFrame) {            onDataRead(ctx, (Http2DataFrame) msg);        } else {            super.channelRead(ctx, msg);        }    }

自定義handler

如果使用Http2FrameCodec,我們只需要在pipline中添加Http2FrameCodec之后,再添加自定義的handler即可:

ctx.pipeline().addLast(Http2FrameCodecBuilder.forServer().build(), new CustHttp2Handler());

因?yàn)镠ttp2FrameCodec已經(jīng)對http2中的frame進(jìn)行了轉(zhuǎn)換,所以我們在CustHttp2Handler中只需要處理自定義邏輯即可。

netty推薦自定義的handler繼承自Http2ChannelDuplexHandler,因?yàn)樗绕胀ǖ腃hannelDuplexHandler多了一個創(chuàng)建newStream()和遍歷所有有效stream的 forEachActiveStream(Http2FrameStreamVisitor)方法。

總結(jié)

本文講解了Http2FrameCodec的原理,和與其搭配的handler實(shí)現(xiàn)中要注意的事項(xiàng)。

本文的例子可以參考:learn-netty4

本文已收錄于 http://www.flydean.com/31-netty-framecodec-http2/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!

歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù),更懂你!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125104.html

相關(guān)文章

  • netty搭建web聊天室(1)

    摘要:提供異步的事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開發(fā)高性能高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序??偨Y(jié)我們完成了服務(wù)端的簡單搭建,模擬了聊天會話場景。 之前一直在搞前端的東西,都快忘了自己是個java開發(fā)。其實(shí)還有好多java方面的東西沒搞過,突然了解到netty,覺得有必要學(xué)一學(xué)。 介紹 Netty是由JBOSS提供的一個java開源框架。Netty提供異步的、事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框...

    izhuhaodev 評論0 收藏0
  • Netty(三) 什么是 TCP 拆、粘包?如何解決?

    摘要:是一個面向字節(jié)流的協(xié)議,它是性質(zhì)是流式的,所以它并沒有分段??苫诜指舴鉀Q。編解碼的主要目的就是為了可以編碼成字節(jié)流用于在網(wǎng)絡(luò)中傳輸持久化存儲。 showImg(https://segmentfault.com/img/remote/1460000015895049); 前言 記得前段時間我們生產(chǎn)上的一個網(wǎng)關(guān)出現(xiàn)了故障。 這個網(wǎng)關(guān)邏輯非常簡單,就是接收客戶端的請求然后解析報文最后發(fā)送...

    YanceyOfficial 評論0 收藏0
  • 使用Netty,我們到底在開發(fā)些什么?

    摘要:比如面向連接的功能包發(fā)送接收數(shù)量包發(fā)送接收速率錯誤計數(shù)連接重連次數(shù)調(diào)用延遲連接狀態(tài)等。你要處理的,就是心跳超時的邏輯,比如延遲重連。發(fā)生異常后,可以根據(jù)不同的類型選擇斷線重連比如一些二進(jìn)制協(xié)議的編解碼紊亂問題,或者調(diào)度到其他節(jié)點(diǎn)。 在java界,netty無疑是開發(fā)網(wǎng)絡(luò)應(yīng)用的拿手菜。你不需要太多關(guān)注復(fù)雜的nio模型和底層網(wǎng)絡(luò)的細(xì)節(jié),使用其豐富的接口,可以很容易的實(shí)現(xiàn)復(fù)雜的通訊功能。 和...

    DesGemini 評論0 收藏0
  • 使用Netty,我們到底在開發(fā)些什么?

    摘要:比如面向連接的功能包發(fā)送接收數(shù)量包發(fā)送接收速率錯誤計數(shù)連接重連次數(shù)調(diào)用延遲連接狀態(tài)等。你要處理的,就是心跳超時的邏輯,比如延遲重連。發(fā)生異常后,可以根據(jù)不同的類型選擇斷線重連比如一些二進(jìn)制協(xié)議的編解碼紊亂問題,或者調(diào)度到其他節(jié)點(diǎn)。 在java界,netty無疑是開發(fā)網(wǎng)絡(luò)應(yīng)用的拿手菜。你不需要太多關(guān)注復(fù)雜的nio模型和底層網(wǎng)絡(luò)的細(xì)節(jié),使用其豐富的接口,可以很容易的實(shí)現(xiàn)復(fù)雜的通訊功能。 和...

    MSchumi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<