zoukankan      html  css  js  c++  java
  • Neety的基础使用及说明

    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方法。
     
      以上为本人自己理解。如有不对,还请指出!
  • 相关阅读:
    JavaScript操作符instanceof揭秘
    Linux打开txt文件乱码的解决方法
    Working copy locked run svn cleanup not work
    poj 2299 UltraQuickSort 归并排序求解逆序对
    poj 2312 Battle City 优先队列+bfs 或 记忆化广搜
    poj2352 stars 树状数组
    poj 2286 The Rotation Game 迭代加深
    hdu 1800 Flying to the Mars
    poj 3038 Children of the Candy Corn bfs dfs
    hdu 1983 Kaitou Kid The Phantom Thief (2) DFS + BFS
  • 原文地址:https://www.cnblogs.com/rrong/p/9712847.html
Copyright © 2011-2022 走看看