摘要:是什么是一個異步的,事件驅動的網絡編程框架。責任鏈模式通過將組裝起來,通過向里添加來監聽處理發生的事件。相比于的的不僅易用,而且還支持自動擴容。入站入站事件一般是由外部觸發的,如收到數據。
netty是什么?
netty是一個異步的,事件驅動的網絡編程框架。
netty的技術基礎netty是對Java NIO和Java線程池技術的封裝
netty解決了什么問題使用Java IO進行網絡編程,一般一個用戶一個線程,無法處理海量用戶
使用Java NIO進行網絡編程,編程復雜性太高,如果沒有深厚的NIO網絡編程基礎,寫出的程序可能還不如Java IO寫的程序
至于Java AIO,目前還沒有弄清楚其與netty孰優孰劣
netty架構是基于Reactor和責任鏈模式進行設計的。
reactor關于reactor的原理,參考“【NIO系列】——之Reactor模型”
netty的reactor是多reactor多線程模型,其中reactor在netty中以eventloop的形式出現。
netty通過popeline將handler組裝起來,通過向pipeline里添加handler來監聽處理發生的事件。
netty服務端編程模式// 用于監聽客戶端鏈接的eventloop池,一般只有一個eventloop NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于處理客戶端IO的eventloop池 NioEventLoopGroup workGroup = new NioEventLoopGroup(); // 輔助類,幫助初始化服務器 ServerBootStrap bootstrap = new ServerBootStrap(); bootstrap.group(bossGroup, workGroup) // bossGroup和workGroup可以是同一個 .channel(NioServerSocketChannel.class) // 設置服務端監聽套接字的channel類型 .option(ChannelOption.SO_BACKLOG, 1024) // 設置監聽套接字的參數 .handler(new LoggingHandler()) // 設置監聽套接字的handler .childHandler(new ChannelInitializernetty客戶端編程模型(){ // 設置客戶端套接字的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(); }
// 用于處理與服務端IO的eventloop池 NioEventLoopGroup group = new NioEventLoopGroup(); // 輔助類,幫助初始化客戶端 BootStrap bootstrap = new BootStrap(); bootstrap.group(group) .channel(NioSocketChannel.class) // 設置客戶端套接字的channel類型 .option(ChannelOption.NO_DELAY, true) // 設置客戶端套接字的參數 .handler(new ChannelInitializerbuffer(){ // 設置客戶端套接字的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認為Java NIO的Buffer太難用了,因此自己實現了一套Buffer。相比于Java NIO的netty的buffer不僅易用,而且還支持自動擴容。
netty的buffer可以抽象為三個指針readIndex, writeIndex, limit.
讀buffer增加readIndex,寫buffer會增加writeIndex,如果寫的數據量超過limit,則會增加buffer容量。netty buffer也支持隨機讀寫
netty中buffer一般通過Unpooled工具類創建,有三大類buffer:
在JVM堆上分配的buffer。優點是分配快速,易于回收,缺點是最終還是要將數據復制到直接緩存中
直接緩沖區,直接通過系統調用malloc分配的內存,優點是減少數據移動,缺點是分配慢,回收麻煩
組合緩沖區,即將不同種類的buffer進行封裝,訪問時就像訪問一個buffer,可以通過這個方式對緩沖區進行劃分,但是會增加訪問時間
handlerhandler分為處理入站事件的handler和出站事件的handler。通過實現相應的方法來監聽相應的事件
netty也提供了一些adapter類來減少開發者的工作量。
入站事件一般是由外部觸發的,如收到數據。
基類為ChannelInboundHandler
出站事件由內部觸發,如寫數據
基類為ChannelOutboundHandler
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77618.html
時間:2018年04月11日星期三 說明:本文部分內容均來自慕課網。@慕課網:https://www.imooc.com 教學源碼:https://github.com/zccodere/s... 學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅動、異步非阻塞的IO Java開源框架 基于NIO的客戶...
摘要:的選擇器允許單個線程監視多個輸入通道。一旦執行的線程已經超過讀取代碼中的某個數據片段,該線程就不會在數據中向后移動通常不會。 1、引言 很多初涉網絡編程的程序員,在研究Java NIO(即異步IO)和經典IO(也就是常說的阻塞式IO)的API時,很快就會發現一個問題:我什么時候應該使用經典IO,什么時候應該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經典IO之...
摘要:隨著狀態發生變化,相應的產生。這些被轉發到中的來采取相應的操作。當收到數據或相關的狀態改變時,這些方法被調用,這些方法和的生命周期密切相關。主要由一系列組成的。采用的線程模型,在同一個線程的中處理所有發生的事。 「博客搬家」 原地址: 簡書 原發表時間: 2017-05-05 學習了一段時間的 Netty,將重點與學習心得總結如下,本文主要總結ChannelHandler 及 E...
摘要:我覺得了解簡歷和面試的技巧可以幫助你更好的去學習重要的知識點以及更好地去準備面試以及面試,說實話,我個人覺得這些東西還挺重要的。在本文里,我將介紹我這段時間里更新簡歷和面試的相關經歷。 分享一篇很不錯的文章!本文作者曾經寫過《Java Web輕量級開發面試教程》和 《Java核心技術及面試指南》這兩本書。我覺得了解簡歷和面試的技巧可以幫助你更好的去學習重要的知識點以及更好地去準備面試以...
摘要:前言本文以自帶的示例工程為例,簡要介紹線程模型示例工程的代碼位于很簡單,僅包含一個方法用于初始化以及,我們來看看其中和線程模型相關的一些代碼在的初始化代碼中實例化了兩個對象和,它們有著公共基類,這個是線程模型的核心類名讓人聯想到組合模式, 前言 本文以 netty 4.1 自帶的示例工程 netty-example 為例,簡要介紹 netty 線程模型 EchoServer echo ...
閱讀 853·2021-11-24 09:38
閱讀 1085·2021-10-08 10:05
閱讀 2577·2021-09-10 11:21
閱讀 2800·2019-08-30 15:53
閱讀 1827·2019-08-30 15:52
閱讀 1964·2019-08-29 12:17
閱讀 3418·2019-08-29 11:21
閱讀 1609·2019-08-26 12:17