摘要:是什么是一個異步的,事件驅(qū)動的網(wǎng)絡(luò)編程框架。責(zé)任鏈模式通過將組裝起來,通過向里添加來監(jiān)聽處理發(fā)生的事件。相比于的的不僅易用,而且還支持自動擴(kuò)容。入站入站事件一般是由外部觸發(fā)的,如收到數(shù)據(jù)。
netty是什么?
netty是一個異步的,事件驅(qū)動的網(wǎng)絡(luò)編程框架。
netty的技術(shù)基礎(chǔ)netty是對Java NIO和Java線程池技術(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)是基于Reactor和責(zé)任鏈模式進(jìn)行設(shè)計的。
reactor關(guān)于reactor的原理,參考“【NIO系列】——之Reactor模型”
netty的reactor是多reactor多線程模型,其中reactor在netty中以eventloop的形式出現(xiàn)。
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 ChannelInitializernetty客戶端編程模型(){ // 設(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(); }
// 用于處理與服務(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 ChannelInitializerbuffer(){ // 設(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(); }
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)行劃分,但是會增加訪問時間
handlerhandler分為處理入站事件的handler和出站事件的handler。通過實(shí)現(xiàn)相應(yīng)的方法來監(jiān)聽相應(yīng)的事件
netty也提供了一些adapter類來減少開發(fā)者的工作量。
入站事件一般是由外部觸發(fā)的,如收到數(shù)據(jù)。
基類為ChannelInboundHandler
出站事件由內(nèi)部觸發(fā),如寫數(shù)據(jù)
基類為ChannelOutboundHandler
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77618.html
時間: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的客戶...
摘要:的選擇器允許單個線程監(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之...
摘要:隨著狀態(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...
摘要:我覺得了解簡歷和面試的技巧可以幫助你更好的去學(xué)習(xí)重要的知識點(diǎn)以及更好地去準(zhǔn)備面試以及面試,說實(shí)話,我個人覺得這些東西還挺重要的。在本文里,我將介紹我這段時間里更新簡歷和面試的相關(guān)經(jīng)歷。 分享一篇很不錯的文章!本文作者曾經(jīng)寫過《Java Web輕量級開發(fā)面試教程》和 《Java核心技術(shù)及面試指南》這兩本書。我覺得了解簡歷和面試的技巧可以幫助你更好的去學(xué)習(xí)重要的知識點(diǎn)以及更好地去準(zhǔn)備面試以...
摘要:前言本文以自帶的示例工程為例,簡要介紹線程模型示例工程的代碼位于很簡單,僅包含一個方法用于初始化以及,我們來看看其中和線程模型相關(guān)的一些代碼在的初始化代碼中實(shí)例化了兩個對象和,它們有著公共基類,這個是線程模型的核心類名讓人聯(lián)想到組合模式, 前言 本文以 netty 4.1 自帶的示例工程 netty-example 為例,簡要介紹 netty 線程模型 EchoServer echo ...
閱讀 877·2021-11-24 09:38
閱讀 1102·2021-10-08 10:05
閱讀 2598·2021-09-10 11:21
閱讀 2814·2019-08-30 15:53
閱讀 1842·2019-08-30 15:52
閱讀 1981·2019-08-29 12:17
閱讀 3431·2019-08-29 11:21
閱讀 1623·2019-08-26 12:17