Netty开篇——NIO章上(三)

这篇具有很好参考价值的文章主要介绍了Netty开篇——NIO章上(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java NIO基本介绍

  1. java non-blocking I/O 称为NIO(也叫New IO)。JDK4开始提供,同步非阻塞
  2. 相关内容在 java.nio 包及子包下,对java.io 包中的很多类进行改写。
  3. 三大核心: Channel(通道),Buffer(缓冲区),Selector(选择器)
  4. NIO是面向缓冲区或者面向块编程。数据读取到一个它后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络
  5. NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据可以读取之前,该线程可以继续做其他的事情。
  6. 通俗理解: NIO 是可以做到用一个线程来处理多个操作。假设有 10000 个请求过来,根据实际情况,可以分配50 或者 100 个线程来处理。不像之前的阻塞IO 那样,非得分配 10000 个。
  7. HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比 HTTP1.1 大了好几个数量级
  8. 基本案例

Netty开篇——NIO章上(三),Netty,nio,java

NIO 和 BIO 的比较

  1. BIO以流的方式处理数据,而NIO以块的方式处理数据,I/O块的效率比I/O流高很多
  2. BIO 是阻塞的,NIO则是非阻塞的
  3. BIO 基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector 选择器用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道

Selector、Channel 和 Buffer 的关系图

  1. 每个channel都会对应一个Buffer
  2. 一个Selector对应一个线程
  3. 多个channel会注册到其selector
  4. Selector会根据不同的Event,在各个Channel上切换
  5. channel 是双向的,可以返回底层操作系统的情况,比如Linux,底层的操作系统通道就是双向的.
  6. Buffer是一个内存块,底层是一个数组
  7. 数据的读取写入是通过 Buffer这个和BIO有所区别,BIO 中要么是输入流,或者是输出流,不能双向,但是NIO的Buffer是可以读也可以写,需要flip()切换

 Netty开篇——NIO章上(三),Netty,nio,java

缓冲区(Buffer)

  1. Buffer本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,Buffer对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 读写的数据都必须经由Buffer
  2. Buffer是父类、抽象类,类的层级关系图
    1. Netty开篇——NIO章上(三),Netty,nio,java
  3. 常用Buffer子类

    • ByteBuffer 存储字节数据到缓冲区
    • shortBuffer 存储字符串数据到缓冲区
    • CharBuffer 存储字符数据到缓冲区
    • IntBuffer 存储整数数据到缓冲区
    • LongBuffer 存储长整型教据到缓冲区
    • DoubleBuffer 存储小数到缓冲区
    • FloatBuffer 存储小数到缓冲区
  4. 这些Buffer都把数据存于自己类型的数组

  5. Buffer类的四个属性:
    • Capacity:容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变
    • Limit:表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的
    • Position:位置,下一个要被读写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写做准备
    • Mark:标记

Netty开篇——NIO章上(三),Netty,nio,java

Netty开篇——NIO章上(三),Netty,nio,java

Buffer类相关方法

public abstract class Buffer{
//JDK1.4时,引入的api
public final int capacity()//返回此缓冲区的容量
public final int position()//返回此缓冲区的位置
public final Buffer position(int newPositio)//设置此缓冲区的位置
public final int limit()//返回此缓冲区的限制
public final Buffer limit(int newLimit)//设置此缓冲区的限制
public final Buffer mark()//在此缓冲区的位置设置标记
public final Buffer reset()//将此缓冲区的位置重置为以前标记的位置
public final Buffer clear()//清除此缓冲区,即将各个标记恢复到初始状态,但是数据并没有真正擦除,
public final Buffer flip()//反转此缓冲区
public final Buffer rewind()//重绕此缓冲区
public final int remaining()//返回当前位置与限制之间的元素数
public final boolean hasRemaining()//告知在当前位置和限制之间是否有元素
public abstract boolean isReadOnly()://告知此缓冲区是否为只读缓冲区
//JDK1.6时引入的api
public abstract boolean hasArray();//告知此缓冲区是否具有可访问的底层实现数组
public abstract Object array();//返回此缓冲区的底层实现数组
public abstract int arrayOffset();/返回此缓冲区的底层实现数组中第一个缓冲区元素的偏移量
public abstract boolean is Direct();//告知此缓冲区是否为直接缓冲区
}

ByteBuffer

  1. 除了boolean,其他基本类型都有一个Buffer类型与之相对应,最常用的自然是 ByteBuffer 类(二进制数据),该类的主要方法如下:
public abstract class ByteBuffer(
//缓冲区创建相关api
public static ByteBuffer allocateDirect(int capacity)//创建直接缓冲区
public static ByteBuffer allocate(int capacity)//设置缓冲区的初始容量
public static ByteBuffer wrap(byte[] array)//把一个数组放到缓冲区中使用
//构造初始化位置offset和上界length的缓冲区
public static ByteBuffer wrap(byte[] array,int offset, int length)
//缓存区存取相关API
public abstract byte get()//从当前位置position上get,get之后,position会自动+1 
public abstract byte get(int index);//从绝对位置get
public abstract ByteBuffer put(byte b);//从当前位置上添加,put之后,position会自动+1 
public abstract ByteBuffer put(int index,byte b);//从绝对位置上put

关于Buffer的注意事项和细节

  1. ByteBuffer支持类型化的put和get,数据类型必须保持一致,否则可能有 BufferUnderflowException 异常。
  2. Buffer支持转换为只读buffer,调用asReadOnlyBuffer()
  3. NIO还提供了MappedByteBuffer,可以让文件直接在内存(堆外内存) 中进行修改,而如何同步到文件由NIO来完成.
  4. NIO还支持通过多个Buffer(buffer数组)完成读写操作即 Scattering(分散)和 Gathering(合并)

 Netty开篇——NIO章上(三),Netty,nio,java

Netty开篇——NIO章上(三),Netty,nio,java文章来源地址https://www.toymoban.com/news/detail-794456.html

到了这里,关于Netty开篇——NIO章上(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以 Java NIO 的角度理解 Netty

    上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识,包括 Netty 的发展历程、核心功能与组件,并且通过实例演示了如何使用 Netty 构建一个 HTTP 服务器。由于 Netty 的抽象程度较高,因此理解起来可能会更加复杂和具有挑战性,所以本文将通过 Java NIO 的处理流程与 Netty 的

    2024年02月12日
    浏览(44)
  • Java NIO 图解 Netty 服务端启动的过程

    了解整体Netty常用的核心组件后,并且对比了传统IO模式。在对比过程中,找到了传统IO对应Netty中是如何实现的。最后我们了解到在netty中常用的那些组件。 本文在了解下这些核心组件的前提下,进一步了解组件如何在整个服务器启动过程如何被创建,如何组件之间配合来使

    2024年02月11日
    浏览(38)
  • 快速入门Java NIO(Not I/O)的网络通信框架--Netty

    了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1.1 Netty 是什么? Netty 是一个异步(基于多线程)的、基于事件驱动(多路复用的那写事件驱动)的网络应用框架,用于快速开发可维护、高性能的

    2024年01月17日
    浏览(51)
  • 【netty基础四】netty与nio

    阻塞I/O在调用InputStream.read()方法时是 阻塞的,它会一直等到数据到来 (或超时)时才会返回; 同样,在调用ServerSocket.accept()方法时,也会一直 阻塞到有客户端连接 才会返回,每个客户端连接成功后,服务端都会启动一个线程去处理该客户端的请求。 阻塞I/O的通信模型示意

    2024年02月10日
    浏览(88)
  • 聊聊分布式架构06——[NIO入门]简单的Netty NIO示例

    目录 Java NIO和Netty NIO比较 Java NIO: Netty: Netty NIO中的主要模块 Transport(传输层) Buffer(缓冲区) Codec(编解码器) Handler(处理器) EventLoop(事件循环) Bootstrap和Channel(引导和通道) Future和Promise(异步编程) Netty示例 服务端时序图 服务端代码 客户端时序图 客户端代码

    2024年02月07日
    浏览(37)
  • NIO和netty的常用类

    给ServerBootstrap配置两个EventLoopGroup,一个建立连接,一个处理网络io。 EventLoopGroup给EventLoop分配线程。 在 Netty 中,EventLoop 通过不断轮询 Selector 来检测 Channel 上发生的事件,当 Channel 上的事件到达时,EventLoop 会将事件传入 相应的Channel 的成员变量 ChannelPipeline 中,经过所有C

    2024年01月25日
    浏览(51)
  • Netty和传统NIO之间的比较

    Netty回显服务器实现: 上述代码是一个使用Netty实现的回显服务器。让我们逐行解释代码的实现: 首先,我们创建了两个 NioEventLoopGroup ,一个用于接收客户端连接(bossGroup),另一个用于处理客户端连接上的请求(workerGroup)。 然后,我们创建一个 ServerBootstrap 实例,并配置

    2024年01月16日
    浏览(41)
  • netty(二):NIO——处理可写事件

    在服务端一次性无法把数据发送完的情况下,需要注册可写事件 服务端一次性是否能够把数据全部发送完成取决于服务端的缓冲区大小,该缓冲区不受程序控制 判断ByteBuffer是否仍有剩余,如果有剩余注册可写事件 监听可写事件,判断数据是否写完,数据写完需要 客户端 服

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包