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监听客户端的连接,监听到客户端的请求连接之后,为每个客户端创建一个新的线程,进行链路处理。处理完之后,通过输出流返回给应答客户端,此时线程销毁。
 
 
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<SocketChannel>的类。注:此类用于对刚刚接收的channel进行初始化。(可进行设置接收传输数据的编码和解码与添加自定义处理逻辑的类,需要继承SimpleChannelInboundHandler<String>。然后重写该类的方法进行自己逻辑部分的处理)
            6.在实现了ChannelInitializer<T>类中实现 了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方法。
 
  以上为本人自己理解。如有不对,还请指出!

Neety的基础使用及说明的更多相关文章

  1. NIO:异步非阻塞I/O,AIO,BIO

    Neety的基础使用及说明 https://www.cnblogs.com/rrong/p/9712847.html BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...

  2. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  3. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  6. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  7. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  8. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  9. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

随机推荐

  1. 领扣(LeetCode)两个列表的最小索引总和 个人题解

    假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答 ...

  2. VMware NAT模式ping通外网[CentOS7]

    使用一张网卡,NAT模式 在编辑里打开虚拟网络编辑器 dhcp设置的范围 你的虚拟机的IP 就在那个范围里 NAT设置里有填网关 这里我们vmware 的设置就OK了 在去把你的网络适配器改下iP 这 ...

  3. pod删除主要流程源码解析

    本文以v1.12版本进行分析 当一个pod删除时,client端向apiserver发送请求,apiserver将pod的deletionTimestamp打上时间.kubelet watch到该事件 ...

  4. 编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry

    本文首发于个人博客https://kezunlin.me/post/12ab5707/,欢迎阅读! cmake with user defined entry Guide FindXXX.cmake ...

  5. Magicodes.IE之导入学生数据教程

    基础教程之导入学生数据 说明 本教程主要说明如果使用Magicodes.IE.Excel完成学生数据的Excel导入. 要点 本教程使用Magicodes.IE.Excel来完成Excel数据导入 需 ...

  6. java学生管理系统

    student类 package cn.itheima.Manag; /** * *标准类 * **/public class Student { //学号 private String id; // ...

  7. Fortran文件读写--查找内容

    program ex implicit none character(len=) A(),B(),C() !A异常.B已开挖.C需标记 integer i,j,N1,N2,count !N1是10号文 ...

  8. springboot整合netty的多种方式

    netty作为一个高性能的io框架,是非好用的一个技术框架, Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户. ...

  9. 从spring boot发邮件聊到开发的友好性

    前些天帮一个朋友做网站,全站都是静态页面,唯一需要用到后端开发的是他需要一个留言板.传统的留言板一般都是提交后保存到数据库,然后提供一个后台的留言列表给管理人员看,我嫌麻烦,就决定留言提交到后台直接发 ...

  10. Xtrabackup 全备和还原以及增量备份和还原

    目录 MySQL环境介绍 全备和还原 准备备份目录 创建测试数据 全量备份 模拟删除数据 还原数据操作 第一步 备份备份文件 第二步 关闭数据库 第三步 移除数据库的data目录 第四步 恢复前准备 ...