• IO、NIO与Netty


    IO、NIO与Netty

    前言:此文主要用于记录Netty学习之后的总结与笔记,较为浅显
    Demo源码地址

    1.BIO、NIO、AIO

    Java中有三种网络模型:BIO、NIO和AIO

    1.1 BIO同步阻塞IO

    BIO就是Java IO包中的一系列流 import java.io.*;

    BIO作为网络编程的Server端的流时,其特点是:

    1. 一个线程只能管理一个连接;
    2. BIO是直接面向流;
    3. 流在调用read()方法时,线程是阻塞的;
    4. 线程利用率低

    1.2 NIO同步非阻塞IO

    NIO是Java NIO包中的一系列流 import java.nio.*;

    特点:

    1. 一个线程可以管理多个连接;
    2. NIO不直接面向流,而是面向缓存区,读取时的效率更高;
    3. 当流没有数据时,当前线程是可以继续执行不阻塞线程的;
    4. 对线程的利用率提升了

    NIO中比较重要的概念与组件:SelectorChannelBuffer

    Selector

    Selector作为NIO最外层的管理者,将服务端比作一个酒馆,其作用就好比一个酒馆中的掌柜的,客人到来就好比客户端的连接,掌柜的就负责给客人分配服务的店小二。

    Channel

    店小二(Channel)就负责听取客人(Client)的要求,客人将要求写在小本本上(Buffer)。

    Buffer

    店小二负责将小本本(Beffer)提交到后厨,后厨看到小本本上的内容,开始制作美食佳酿。好了到这里我们后端就知道了客人想要什么东西了。

    NIO对比BIO的优势就在,NIO只需要一个掌柜的(一个线程中的Selector)就可以管理多个连接,而BIO需要开启多个线程(掌柜的)才行,这里一看就发现BIO对于资源是很浪费的。

    NIO也有其缺点:

    编程复杂,需要考虑各种复杂情况、异常处理、线程的运用,于是乎,有了Netty

    1.3 AIO异步IO(不作介绍)

    2.Netty

    Netty是什么

    Netty是基于Java开发的一个高性能、高吞吐的网络编程框架,其中包括了对NIO的封装,使用了多线程,选用了高效的线程模型。

    线程模型

    Reactor单线程

    Reactor多线程

    Reactor主从

    Netty架构

    Netty的线程模型就是采用上面的Reactor主从模式。主BossNioEventLoopGroup与子WorkerNioEventLoopGroup

    Boss负责建立与客户端之间连接的通道(Channel),Worker则负责监听客户端通道中的消息,然后通过Handler进行处理。

    Netty的组件

    NioEventLoopGroup

    NioEventLoopGroup维护了多个NioEventLoop,一个NioEventLoop代表一个线程。
    NioEventLoop维护了SelectorTaskQueue

    NioServerSocketChannel

    NIO Socket网络连接服务端通道

    ChannelHandler

    ChannelHandler负责处理客户端到来的数据,可以由用户实现SimpleChannelInboundHandler类,重写channelRead0(ChannelHandlerContext ctx, String msg)方法,也可以使用默认的处理器例如:StringDecoderHttpServerCodecIdleStateHandler

    ChannelPipeline

    上述处理器,需要ChannelInitializer进行一个初始化,初始化的过程中,就使用到了ChannelPipelineChannelPipelineChannelHandlerContext之间互相依赖,使用了责任链模式

  • 相关阅读:
    Category
    [转]IOS, xib和storyboard的混用
    关于delegate, category和subclass
    iOS 在viewController中监听Home键触发以及重新进入界面的方法
    ios获取当前语言
    Xcode Product -> Archive disabled
    安卓虚拟机启动后报错: 类似 SDK Manager] Error: Error parsing .....devices.xml 解决方案
    Objective-C中一个方法如何传递多个参数的理解
    oc的内存管理
    ios中Raw文件系统常用文件夹
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/16359329.html
Copyright © 2020-2023  润新知