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

資訊專欄INFORMATION COLUMN

netty學(xué)習(xí)總結(jié)(一)

CntChen / 2001人閱讀

摘要:是什么是一個異步的,事件驅(qū)動的網(wǎng)絡(luò)編程框架。責(zé)任鏈模式通過將組裝起來,通過向里添加來監(jiān)聽處理發(fā)生的事件。相比于的的不僅易用,而且還支持自動擴(kuò)容。入站入站事件一般是由外部觸發(fā)的,如收到數(shù)據(jù)。

netty是什么?

netty是一個異步的,事件驅(qū)動的網(wǎng)絡(luò)編程框架。

netty的技術(shù)基礎(chǔ)

netty是對Java NIOJava線程池技術(shù)的封裝

netty解決了什么問題

使用Java IO進(jìn)行網(wǎng)絡(luò)編程,一般一個用戶一個線程,無法處理海量用戶
使用Java NIO進(jìn)行網(wǎng)絡(luò)編程,編程復(fù)雜性太高,如果沒有深厚的NIO網(wǎng)絡(luò)編程基礎(chǔ),寫出的程序可能還不如Java IO寫的程序
至于Java AIO,目前還沒有弄清楚其與netty孰優(yōu)孰劣

netty架構(gòu)

netty架構(gòu)是基于Reactor和責(zé)任鏈模式進(jìn)行設(shè)計的。

reactor

關(guān)于reactor的原理,參考“【NIO系列】——之Reactor模型”
netty的reactor是多reactor多線程模型,其中reactor在netty中以eventloop的形式出現(xiàn)。

責(zé)任鏈模式

netty通過popeline將handler組裝起來,通過向pipeline里添加handler來監(jiān)聽處理發(fā)生的事件。

netty服務(wù)端編程模式
// 用于監(jiān)聽客戶端鏈接的eventloop池,一般只有一個eventloop
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
// 用于處理客戶端IO的eventloop池
NioEventLoopGroup workGroup = new NioEventLoopGroup();
// 輔助類,幫助初始化服務(wù)器
ServerBootStrap bootstrap = new ServerBootStrap();
bootstrap.group(bossGroup, workGroup) // bossGroup和workGroup可以是同一個
        .channel(NioServerSocketChannel.class) // 設(shè)置服務(wù)端監(jiān)聽套接字的channel類型
        .option(ChannelOption.SO_BACKLOG, 1024) // 設(shè)置監(jiān)聽套接字的參數(shù)
        .handler(new LoggingHandler()) // 設(shè)置監(jiān)聽套接字的handler
        .childHandler(new ChannelInitializer(){
            // 設(shè)置客戶端套接字的handler
            public void initChannle(SocketChannel ch){
                // 向pipleline中添加handler,用于處理客戶端IO
                ch.pipeline().addLast(...); 
            }
        });
int port = 8080;
try{
    ChannelFuture f = bootstrap.bind(port).sync();
    f.channel().closeFuture().sync();
}catch(IOException e){
    e.printStacktrac();
}finally{
    bossGroup.shutdownGracefully();
    workGroup.shutdownGracefully();
}
netty客戶端編程模型
// 用于處理與服務(wù)端IO的eventloop池
NioEventLoopGroup group = new NioEventLoopGroup();
// 輔助類,幫助初始化客戶端
BootStrap bootstrap = new BootStrap();
bootstrap.group(group)
        .channel(NioSocketChannel.class) // 設(shè)置客戶端套接字的channel類型
        .option(ChannelOption.NO_DELAY, true) // 設(shè)置客戶端套接字的參數(shù)
        .handler(new ChannelInitializer(){
            // 設(shè)置客戶端套接字的handler
            public void initChannel(SocketChannel ch){
                // 向pipleline中添加handler,用于處理客戶端IO
                ch.pipeline().addLast(...); 
            }
        });
String host = "127.0.0.1";
int port = 8080;
try{
    ChannelFuture f = bootstrap.connect(host, port).sync();
    f.channel().closeFuture().sync();
}catch(IOException e){
    e.printStacktrac();
}finally{
    group.shutdownGracefully();
}
buffer

netty認(rèn)為Java NIO的Buffer太難用了,因此自己實(shí)現(xiàn)了一套Buffer。相比于Java NIO的netty的buffer不僅易用,而且還支持自動擴(kuò)容。

netty的buffer可以抽象為三個指針readIndex, writeIndex, limit.
讀buffer增加readIndex,寫buffer會增加writeIndex,如果寫的數(shù)據(jù)量超過limit,則會增加buffer容量。netty buffer也支持隨機(jī)讀寫

netty中buffer一般通過Unpooled工具類創(chuàng)建,有三大類buffer:

在JVM堆上分配的buffer。優(yōu)點(diǎn)是分配快速,易于回收,缺點(diǎn)是最終還是要將數(shù)據(jù)復(fù)制到直接緩存中

直接緩沖區(qū),直接通過系統(tǒng)調(diào)用malloc分配的內(nèi)存,優(yōu)點(diǎn)是減少數(shù)據(jù)移動,缺點(diǎn)是分配慢,回收麻煩

組合緩沖區(qū),即將不同種類的buffer進(jìn)行封裝,訪問時就像訪問一個buffer,可以通過這個方式對緩沖區(qū)進(jìn)行劃分,但是會增加訪問時間

handler

handler分為處理入站事件的handler和出站事件的handler。通過實(shí)現(xiàn)相應(yīng)的方法來監(jiān)聽相應(yīng)的事件
netty也提供了一些adapter類來減少開發(fā)者的工作量。

入站handler

入站事件一般是由外部觸發(fā)的,如收到數(shù)據(jù)。
基類為ChannelInboundHandler

出棧handler

出站事件由內(nèi)部觸發(fā),如寫數(shù)據(jù)
基類為ChannelOutboundHandler

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

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

相關(guān)文章

  • 慕課網(wǎng)_《Netty入門之WebSocket初體驗》學(xué)習(xí)總結(jié)

    時間:2018年04月11日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s... 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅(qū)動、異步非阻塞的IO Java開源框架 基于NIO的客戶...

    Noodles 評論0 收藏0
  • 少啰嗦!分鐘帶你讀懂Java的NIO和經(jīng)典IO的區(qū)別

    摘要:的選擇器允許單個線程監(jiān)視多個輸入通道。一旦執(zhí)行的線程已經(jīng)超過讀取代碼中的某個數(shù)據(jù)片段,該線程就不會在數(shù)據(jù)中向后移動通常不會。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說的阻塞式IO)的API時,很快就會發(fā)現(xiàn)一個問題:我什么時候應(yīng)該使用經(jīng)典IO,什么時候應(yīng)該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經(jīng)典IO之...

    Meils 評論0 收藏0
  • Netty 框架總結(jié)「ChannelHandler 及 EventLoop」

    摘要:隨著狀態(tài)發(fā)生變化,相應(yīng)的產(chǎn)生。這些被轉(zhuǎn)發(fā)到中的來采取相應(yīng)的操作。當(dāng)收到數(shù)據(jù)或相關(guān)的狀態(tài)改變時,這些方法被調(diào)用,這些方法和的生命周期密切相關(guān)。主要由一系列組成的。采用的線程模型,在同一個線程的中處理所有發(fā)生的事。 「博客搬家」 原地址: 簡書 原發(fā)表時間: 2017-05-05 學(xué)習(xí)了一段時間的 Netty,將重點(diǎn)與學(xué)習(xí)心得總結(jié)如下,本文主要總結(jié)ChannelHandler 及 E...

    VioletJack 評論0 收藏0
  • 位大佬的親身經(jīng)歷總結(jié):簡歷和面試的技巧

    摘要:我覺得了解簡歷和面試的技巧可以幫助你更好的去學(xué)習(xí)重要的知識點(diǎn)以及更好地去準(zhǔn)備面試以及面試,說實(shí)話,我個人覺得這些東西還挺重要的。在本文里,我將介紹我這段時間里更新簡歷和面試的相關(guān)經(jīng)歷。 分享一篇很不錯的文章!本文作者曾經(jīng)寫過《Java Web輕量級開發(fā)面試教程》和 《Java核心技術(shù)及面試指南》這兩本書。我覺得了解簡歷和面試的技巧可以幫助你更好的去學(xué)習(xí)重要的知識點(diǎn)以及更好地去準(zhǔn)備面試以...

    pingan8787 評論0 收藏0
  • Netty 4.1 源代碼學(xué)習(xí):線程模型

    摘要:前言本文以自帶的示例工程為例,簡要介紹線程模型示例工程的代碼位于很簡單,僅包含一個方法用于初始化以及,我們來看看其中和線程模型相關(guān)的一些代碼在的初始化代碼中實(shí)例化了兩個對象和,它們有著公共基類,這個是線程模型的核心類名讓人聯(lián)想到組合模式, 前言 本文以 netty 4.1 自帶的示例工程 netty-example 為例,簡要介紹 netty 線程模型 EchoServer echo ...

    monw3c 評論0 收藏0

發(fā)表評論

0條評論

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