Netty简介

  一、什么是netty?

      高性能 事件驱动

      异步非堵塞 基于NIO的客户端,服务器端编程框架

      稳定性和伸缩性   

  二、Netty的使用场景

      高性能领域
       多线程并发领域
       异步通信领域

四种IO介绍

  1、BIO通信

     (1)一个线程负责连接
    (2)一个请求一个应答
    (3)缺乏弹性伸缩能力 当客户端访问增大,线程造成进程宕机。不能对外服务。

  2、伪异步IO通信

     (1)线程池负责连接 当有新的客户端进来,将客户端的socket封装成Task投入线程池。
    (2)m请求n应答 将所有的请求放到一个线程池中,由线程池来分配线程;做到异步通信。
    (3)线程池阻塞 线程池可以设置最大访问数。并发不断增加,可能造成阻塞。

  3、NIO通信

    (1)缓冲区Buffer ————>>> 他是一个对象,包含读和写的数据,所有数据都是用缓冲区处理的。

    (2)通道Channel ————>>> 他就像是一个自来水管一样,网络数据通过Channel读取或写入,通道与流的不同之处在于通道是双向的,流只是在一个水平线上移动,一个流他必须是inputStrem或outputStrem的子类,通道可以用于读写,或者二者同时进行。

    (3)多路复用器Selector ————>>> 它会不断的轮询注册在其上的channel,如果channel发生读或写事件,那么这个channel就处于就绪状态,会被selector轮询出来,然后通过selectorKey获取就channel集合,进行后续的io操作。由于jdk使用epoll()替代传统的selector实现,所以他并没有最大连接句柄限制,也就意味着只需要一个负责轮询selector的线程就可以接入成千上万的channel.

  4、AIO通信

     (1)连接注册读写事件和回调函数

    (2)读写方法异步

    (3)主动通知程序

    总结:AIO异步通道通过两种方式获得操作结果,第一种就是通过返java.util.concurrent.Futur对象,第二种方式是为操作提供一个回调参数java.nio.channels.CompletionHandler,这个回调类包含completed,failed两个方法。那么AIO的套接字通道是真正的异步非阻塞io,他不需要对注册的多路复用器进行轮询操作就能实现异步读写,简化了NIO模型,这就是AIO通信。

Netty的WebSocket通信实现

  一、Netty实现WebScoket通信案例

       (1)编写存储整个工程的全局配置类 ===》 这里需要有一个Channel对象来存储每一个接入进来的客户端 ===》 ChannelGroup对象 ===》为它赋值的是一个默认的ChannelGroup(DefaultChannelGroup)这里他需要一个GlobalEventExecutor.INSTANCE参数。

    (2)编写WebSocket核心类。
这个类继承了SimpleChannelInboundHandler抽象类,同时这个抽象类又继承了ChannelHandlerAdapter类,然后重写ChannelHandlerAdapter类中的channelActive、channelInactive、channelReadComplete、exceptionCaught四个方法和该抽象类的messageReceived方法。在重写messageReceived方法时编写需要的业务处理方法和握手请求业务方法就行了。

    (3)编写初化连接时的各个组件
这个类是继承了ChannelInitializer抽象类。重写默认的initChannel方法,调用传入的socketChannel对象通道,将各个组件写入该对象。

    

Netty之WebSocket和四种IO介绍的更多相关文章

  1. 【websocket】spring boot 集成 websocket 的四种方式

    集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...

  2. mysql进阶(六)模糊查询的四种用法介绍

    mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...

  3. 四种IO模型

    四种 IO 模型:       首先需要明确,IO发生在 用户进程 与 操作系统 之间.可以是客户端IO也可以是服务器端IO. 阻塞IO(blocking IO):     在linux中,默认情况下 ...

  4. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  5. 【转载】小结一下linux 2.6内核的四种IO调度算法

    在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺 ...

  6. 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示

    在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...

  7. 图解四种 IO 模型

    最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望.但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方. 例如在博客中,过于大白话的语言 ...

  8. Rational Rose的四种视图介绍

    Rose模型中有四种视图:Use Case View(用例视图),Logical View(逻辑视图),Component View(组建视图)和Deployment View(配置视图). 用例视图 ...

  9. Java 四种引用介绍及使用场景

    强引用-FinalReference 介绍: 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式: String str = new String("s ...

随机推荐

  1. NPM 在MacOSX中的使用技巧

    经常看到有人说『为啥npm install 的时候报错,显示EACCESS错误…』,之前大家都是sudo大法解决问题,也没太在意. 至于这个问题是brew安装工具的时候造成的,还是系统修改磁盘权限造成 ...

  2. js 时间格式处理插件 moment

    官网: http://momentjs.cn/docs/#/plugins/ 各种API官网上都有详细的例子,这里就不做一一说明. 重点讲两个常用的: 一.获取当前日期 moment().format ...

  3. C++ 创建文件的方法

    CString getPath(){ CTime time = CTime::GetCurrentTime(); CString t = time.Format(_T("%Y%m%d%H%M ...

  4. Digging-贪心

    When it comes to the Maya Civilization, we can quickly remind of a term called the end of the world. ...

  5. hibernate学习五 Hibernate补充

    1  MiddleGenIDE可以生成映射类和映射文件. 2

  6. Linux 包管理基础:apt、yum、dnf 和 dpkg

    https://linux.cn/article-8782-1.html 1. apt-get 安装( 在线) 会帮我把所有的依赖包都一起安装 apt-get install xxx 安装xxx .如 ...

  7. JS---设置简易红绿灯

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. 开源.Net项目合集

    http://www.cnblogs.com/StrangeCity/p/OpenSourceProject.html

  9. 将Angular6自己定义的模块发布成npm包

    创建自己的模块组件 1. ng new 一个工程 2. ng g m 创建模块 例如我这里的modules文件下创建header模块 3. ng g c modules/head 创建一个hear组件 ...

  10. 51nod1202【DP-树状数组维护】

    思路: DP[i]代表从1 到 i 以 a[i] 为末尾的子序列个数,dp[i]=dp[i]+dp[j](a[i]!=a[j]) +1 利用树状数组维护以值 a[i] 结尾的子序列个数. #inclu ...