Neety的基础使用及说明

https://www.cnblogs.com/rrong/p/9712847.html

BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一个线程

伪异步IO:创建线程池,由线程池里边的线程负责连接处理,M个个请求进来时,会在线程池创建N个线程。容易出现线程池阻塞。由一个线程池来处理客户端的请求。

NIO:异步非阻塞,服务器实现模式为一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

对于NIO,有两点需要强调的:

(1)关于概念有两种理解,New I/O(相对于之前的I/O库是新增的)和Non-block I/O(非阻塞的)。由于NIO的目标就是让java支持非阻塞I/O,所有更多人喜欢用Non-block I/O。

(2)很多人喜欢将NIO称为异步非阻塞I/O,但是,如果按照严格的NUIX网络编程模型和JDK的实现进行区分,实际上它只是非阻塞I/O,不能称之为异步非阻塞I/O。但由于NIO库支持非阻塞读和写,相对于之前的同步阻塞读和写,它是异步的,因此很多人习惯称NIO为异步非阻塞I/O。

AIO: JDK1.7升级了NIO库,升级后的NIO库被称为NIO2.0,正式引入了异步通道的概念。NIO2.0的异步套接字通道是真正的异步非阻塞I/O,此即AIO。其服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

BIO(一请求以应答模型): 一个独立的acceptor监听客户端的连接,监听到客户端的请求连接之后,为每个客户端创建一个新的线程,进行链路处理。处理完之后,通过输出流返回给应答客户端,此时线程销毁。

以上解释也可参考博文https://blog.csdn.net/u012285489/article/details/44646813

Netty服务器的原理:

图中每次请求的读取是通过UpStream来实现,然后激活我们的服务逻辑如EchoServerHandler,而服务器向外写数据,也就是响应是通过DownStream实现的。每个通道Channel包含一对UpStream和DownStream,以及我们的handlers(EchoServerHandler),如下图,这些都是通过channel pipeline封装起来的,数据流在管道里流动,每个Socket对应一个ChannelPipeline。

channel pipeline是关键:

为每个Channel 保留 ChannelHandlers ,如EchoServerHandler

所有的事件都要通过它

一个Channel对应一个 ChannelPipeline

包含协议编码解码 安全验证SSL/TLS和应用逻辑

非阻塞的IO通信框架

Netty概述:

1、netty是基于Java NIO的网络应用框架,client-server框架

2、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,

作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,

通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

3、作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,

Netty的使用:

1.创建一个服务器端(ServerBootstrap)

1.需要创建两个对象, new NioEventLoopGroup();

2.然后创建一个服务器端的对象new ServerBootstrap();

3.使用服务器对象调用group方法将第一步创建的两个对象传入到服务器对象中。

4.然后再调用channel方法传入NioServerSocketChannel.class

5.在接着调用childHandler方法,传入继承了ChannelInitializer的类。注:此类用于对刚刚接收的channel进行初始化。(可进行设置接收传输数据的编码和解码与添加自定义处理逻辑的类,需要继承SimpleChannelInboundHandler。然后重写该类的方法进行自己逻辑部分的处理)

6.在实现了ChannelInitializer类中实现 了initChaannel方法,然后需要获取ChannelPipeline这个类来进行设置,获取方法是:通过该实现方法的参数.pipeline方法来得到。从而可以进行设置接收到channel进行编码解码的设置与添加自己逻辑部分的类。

7.添加自己的逻辑部分的类或代码了。使用上步得到的CHannelPipeline来调用addLast方法添加。设置编码和解码也一样。,附图:

   8.开始编写继承了SimpleChannelInboundHandler类的类,然后重写该类的一些方法来完成自己的逻辑代码。
channelActive():建立连接的时候触发
channelRead0():收到客户端发来的消息的时候触发
.....
9.绑定端口开始接收进来的连接,使用服务器端对象调用bind方法绑定端口号然后调用sync方法来进行监听并接受连接
10.关闭服务器使用 future.channel().closeFuture().sync();来关闭服务器

并关闭第一步所创建的两个NioEventLoopGroup。调用shutdownGracefully方法

注:上述为创建了一个服务器端步骤

如果在继承了SimpleChannelInboundHandler类的上边添加@Sharable注解

第五步必须为调用childHandler,否则报错childHandler not set

注解解释:

@Sharable // 表示它可以被添加到多个ChannelPipeline中。

2.创建一个客户端(Bootstrap)
1.创建一个NioEventLoopGroup对象,用来传入下班创建的Bootstrap客户端对象。
2.创建Bootstrap客户端对象
3.使用创建的客户端对象调用group对象窜入创建 NioEventLoopGroup对象。然后下边和创建服务器端对象的步骤一样到第9步。注:这里跟服务器端第五步稍微有点区别,客户端调用的是handler方法,而服务器端调用的是childHandler方法
4.开始连接服务器,使用创建的客户端对象调用connect对象将所需要连接的服务器ip及端口号。然后再调用sync方法进行与服务器的连接。
5.向服务器端发送数据,需要创建一个Channel对象,使用第四步创建的对象嗲用channel方法得到一个Channel对象。然后使用该对象调用writeAndFlush方法来像服务器端发送数据。
6.关闭当前与服务器连接的话将第一步创建的NioEventLoopGroup对象关闭即可,调用shutdownGracefully方法。

注:可参考博文:https://blog.csdn.net/javadhh/article/details/66477423

  以上为本人自己理解。如有不对,还请指出!

NIO:异步非阻塞I/O,AIO,BIO的更多相关文章

  1. java的高并发IO原理,阻塞BIO同步非阻塞NIO,异步非阻塞AIO

    原文地址: IO读写的基础原理 大家知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用.在不同的操作系统中,IO读写的系统调用的名称可能不完 ...

  2. AIO异步非阻塞学习

    Client:客户端 package aio; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddre ...

  3. java网络通信:异步非阻塞I/O (NIO)

    转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...

  4. nodejs的异步非阻塞IO

    简单表述一下:发启向系统IO操作请求,系统使用线程池IO操作,执行完放到事件队列里,node主线程轮询事件队列,读取结果与调用回调.所以说node并非真的单线程,还是使用了线程池的多线程. 上个图看看 ...

  5. JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  6. Linux-同步异步非阻塞阻塞的解析

    一.理解同步.异步.阻塞.非阻塞 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(同步阻塞) 老张觉得自己有点傻. 2 老张把水壶放到火上 ...

  7. 使用tornado让你的请求异步非阻塞

    http://www.dongwm.com/archives/shi-yong-tornadorang-ni-de-qing-qiu-yi-bu-fei-zu-sai/?utm_source=tuic ...

  8. 异步非阻塞IO的Python Web框架--Tornado

    Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBo ...

  9. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

随机推荐

  1. JSP与Servlet之后台页面单条删除与多条删除的页面跳转之实现

    单条删除页面跳转 1.首先打开JSP页面,找到删除 2.这个时候要把它改成servlet的URL,并决定要传给后台什么数据,例如我需要传一个待删数据的ID id并不是什么见不得人的东西(而且是后台也不 ...

  2. 【HTML5校企公益课】第三天

        1.上午2D.旋转变色的... 基本思路就是先写静态画面然后添加动画. <!--告诉浏览器该文件为网页格式--> <html> <!--网页的头部标签--> ...

  3. Madplay移植到mini2440开发板【转】

    本文转载自:https://blog.csdn.net/simanstar/article/details/24035379 madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1 ...

  4. springboot--配置文件加载顺序

    -file:./config(内部配置) -file:./ (内部配置) -classpath:/config (外部配置) -classpath:/ (外部配置) 运维: spring -jar s ...

  5. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  6. jmeter-执行多个sql查询语句

    1.添加jdbc connection(注意标红部分) 2.添加jdbc request 3.查看结果树

  7. scala学习手记3 - var和val

    scala中用var和val定义变量都是可以的. 用val定义的变量是不可变的,被初始化后值就固定下来,不可以再被修改(这类似于java中的final关键字):用var定义的变量是可变的,可以任意修改 ...

  8. TCP_AIO_Server_ZC_02

    ZC: 这个例子是,1个skt 投递 N个未决的接收操作 (记得 以前查过 说 线程数是 CUP数量的2倍 比较合适) 1. // 当需要 投递多个接收操作的时候,可以将接收缓冲封装成类,然后再投递多 ...

  9. Spring简洁版总结

    一:为什么使用spring? spring泉眼,最好的水,在企业开发中,是业务层最好的框架 spring优点是什么? 1.低侵入,低耦合 2.方便集成其他框架 3.降低javaee开发难度 4.spr ...

  10. Spark- 根据ip地址计算归属地

    主要考察的是广播变量的使用: 1.将要广播的数据 IP 规则数据存放在HDFS上,(广播出去的内容一旦广播出去产就不能改变了,如果需要实时改变的规则,可以将规则放到Redis中) 2.在Spark中转 ...