Netty之WebSocket和四种IO介绍
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介绍的更多相关文章
- 【websocket】spring boot 集成 websocket 的四种方式
集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...
- mysql进阶(六)模糊查询的四种用法介绍
mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...
- 四种IO模型
四种 IO 模型: 首先需要明确,IO发生在 用户进程 与 操作系统 之间.可以是客户端IO也可以是服务器端IO. 阻塞IO(blocking IO): 在linux中,默认情况下 ...
- mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- 【转载】小结一下linux 2.6内核的四种IO调度算法
在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺 ...
- 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...
- 图解四种 IO 模型
最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望.但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方. 例如在博客中,过于大白话的语言 ...
- Rational Rose的四种视图介绍
Rose模型中有四种视图:Use Case View(用例视图),Logical View(逻辑视图),Component View(组建视图)和Deployment View(配置视图). 用例视图 ...
- Java 四种引用介绍及使用场景
强引用-FinalReference 介绍: 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式: String str = new String("s ...
随机推荐
- RabbitMQ的持久化机制
一.问题的引出 RabbitMQ的一大特色是消息的可靠性,那么它是如何保证消息可靠性的呢?——消息持久化.为了保证RabbitMQ在退出,服务重启或者crash等异常情况下,也不会丢失消息,我们可以将 ...
- django-crontab 定时执行任务方法
需求 每天请求一封邮件,并读取该邮件 这个其实可以使用linux 自带了crontab实现,但是毕竟是django 开发.想着不知道有没有方法可以从django 中实现. 简单搜索了下,这方面的方法确 ...
- HTML5设计原理
HTML5是Web标准的巨大飞跃,它为什么要包含那些东西,它背后的设计原则是什么? <JavaScript DOM编程艺术>和<HTML5 For Web Designer>作 ...
- C++常见错误总结
1. error C2871: 'std' : does not exist or is not a namespace 原来 C++有两个不同版本的头文件.引入名字空间这个概念以前编译器用的是#i ...
- 生成分布式随机ID
经测试,最快的一种 public class Generator { // should be between 40 (34 years) and 42 (139 years) ; // should ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- 《Java多线程编程核心技术》读后感(六)
多线程的死锁 package Second; public class DealThread implements Runnable { public String username; public ...
- Linux系统下使用split命令分割大文件 (转载)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://snailwarrior.blog.51cto.com/680306/140531 ...
- 51nod 1086【背包·DP】
思路: 如果体积乘以数量>=W,那么直接用完全背包模型.如果不到的话,用二进制优化就好了. 基础题,感觉这样写很优雅?回去睡觉. #include <bits/stdc++.h> u ...
- [51nod] 1432 独木桥 贪心
n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? Input 第一行包含 ...