iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Netty入门知识点有哪些
  • 803
分享到

Netty入门知识点有哪些

2023-06-19 10:06:36 803人浏览 八月长安
摘要

本篇内容介绍了“Netty入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java NIO再说Netty 之前先简单了解下Ja

本篇内容介绍了“Netty入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java NIO

再说Netty 之前先简单了解下Java 的Nio,因为Netty也是为了简化我们的编码对Java NIO进行了一系列的封装。

Java NIO 从java领域讲就是 NEW I/O ,另一种就是Non-blocking I/O。它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。

在NIO中有三个非常重要的概念,缓冲区(Buffer)、通道(Channel)、选择器(Selector)

缓冲区(Buffer)
1、基础概念

缓冲区本质上来说就是一个数组,在NIO中,所有的操作都是面向缓冲区的。读取数据时,是从缓冲区读取,写入数据时也是写入到缓冲区。所有NIO的数据操作都是操作的缓冲区,而面向流I/O系统中,数据是直接写入到Stream对象中的。

在NIO api中所有的缓冲区类型都继承Buffer,我们经常用到的就是ByteBuffer,NIO这边对Java的基本类型都有实现。

2、基本原理

上面提到过缓冲区其实就是一个数组,其实是一个特殊的数组,它里面内置了一些机制来帮助我们进行数据的读写,能够跟踪和记录缓冲区的变化方便我们使用。

在缓冲区中有三个重要的属性进行合作完成了缓存区内部状态变化的跟踪:

  • position: 指定下一个将要被写入或者读取的元素索引,它的值由get()/put()方法自动更新,在新创建一个Buffer对象时,position被初始化为0。

  • limit: 指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)

  • capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量.

以上三个属性的之间的关系 :0<=position<=limit<=capacity。也就是说当我们创建一个容量为10的ByteBuffer对象时,初始化的时候,position设置为0,limit和capacity设置为10,在以后使用ByteBuffer对象过程中,capacity的值不会再发生变化,而其他两个将会随着使用而变化。

简单的写个伪代码:

//1、分配一个容量为10的缓冲区ByteBuffer buffer = ByteBuffer.allocate(10);//2、然后我们可以执行操作将数据读取到bufferchannel.read(buffer);//3、读取到buffer后我们需要对buffer 进行翻转操作(重点)buffer.flip();//4、翻转后,就可以从buffer 里面进行数据读取了buffer.get();//5、重置bufferbuffer.clear();

上面大体上分为了五部分,下面简单的了解下到底发生了什么? 1、初始化buffer,分配空间,可以直观的看到buffer三个参数的位置 Netty入门知识点有哪些

从通道中读取一些数据到缓冲区,这里我们读取了4个数据,可以看到position此时为4,而limit为10 Netty入门知识点有哪些

当我们需要把数据从缓冲出输出时,必须先调用flip()方法。此方法完成了两件事:一是把limit值设置为当前position的值。二是设置position值为0。其实就是为了告诉我们当前数据的头和尾是什么。

Netty入门知识点有哪些

通过get()丛缓冲区读取数据,这时position值会随着数据读取增加,而limit保持不变,但position不会超过limit的值。 Netty入门知识点有哪些

在数据读取完成后,我们可以使用clear()方法将buffer状态进行初始化 Netty入门知识点有哪些

3、缓冲区分配

在上面例子中我们可以看到分配一个缓冲区对象时,会调用方法allocate(10),相当于创建了一个指定大小的数组,并包装成缓冲区对象。 分配缓冲区一般有两种方式:

//1、分配指定大小缓冲区ByteBuffer buffer = ByteBuffer.allocate(10);//2、包装现有数组byte[] arr = new byte[10];ByteBuffer buffer2 = ByteBuffer.warp(arr);
4、子缓冲区

子缓冲区,就是在我们刚才ByteBuffer.allocate(10)分配的空间内在划出一块区域独立操作,调用slice() 可创建一个子缓冲区。子缓冲区和当前缓冲区是数据共享的,其实只是给其实一块区域提供了一个视图窗口。

5、只读缓冲区

看名字就知道,这buffer只能读取数据。我们可以调用asReadOnlyBuffer()方法,将我们的ByteBuffer 转换为只读缓冲区,注意,这个方法不是真的将我们当前缓冲区转换为只读了,而是返回来一个和当前缓冲区参数一样的缓冲区,并和原缓冲区数据共享,只不过这个是只读的。如果原缓冲区内容发送改变,只读缓冲区内容也会发生变化(简单理解下就是增加了一个只读引用) 伪代码

ByteBuffer buffer = ByteBuffer.allocate(10);//创建只读缓冲区ByteBuffer readonly = buffer.asReadOnlyBuffer();
6、直接缓冲区

都知道我们不管怎么创建buffer其实都在JVM内部,在进行数据传输的时候都避免不了,从虚拟机内存拷贝到内核空间的复制操作。而直接缓冲区,就是省略了从用户空间到内核空间拷贝的过程,使用了一个物理内存映射文件来直接对数据进行操作。在代码中使用是很简单的,需调用allocateDirect()方法,而不是allocate()方法。

Netty入门知识点有哪些

7、内存映射(mmap)

内存映射是一种读和写文件数据的方法,比常规基于流或通道的I/O快的多。简单点说就是将文件的磁盘扇区映射到进程的虚拟内存空间的过程。

选择器

与传统Client/Server模式不同,NIO中非阻塞I/O采用了基于Reactor模式的工作方式,I/O调用不会被阻塞,而是注册感兴趣的特定I/O事件,如可读数据到达、新的套接字连接等,在发生特定事件时,系统再通知我们。NIO中实现非阻塞I/O的核心对象是Selector,Selector是注册各种I/O事件的地方,而且当那些事件发生时,就是Seleetor告诉我们所发生的事件

Netty入门知识点有哪些

从图中可以看出,当有读或写等任何注册的事件发生时,可以从Selector中获得相应的SelectionKey,同时从SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据

使用NIO中非阻塞I/O编写服务器处理程序,大体上可以分为下面三个步骤。

  • (1)向Selector对象注册事件。

  • (2)从Selector中获取事件。

  • (3)根据不同的事件进行相应的处理。

通道

通道就是一个对象,它可以帮我们进行数据读取和写入,当然所有数据都是通过操作Buffer对象来处理的。

1、NIO读取写入数据

读取数据分为三步:

  • (1)从FileInputStream获取Channel。

  • (2)创建Buffer。

  • (3)将数据从Channel读取到Buffer中。

来看下伪代码

//获取文件ChannelFileChannel fc = out.getChannel();//分配缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);buffe.put(1);buffe.put(2);buffer.flip();//将数据写入文件fc.write(buffer);out.close();
2、多路复用I/O

什么是多路复用器? 1、解决IO 状态的问题 不解决你的IO 读写数据的问题。 2、解决用更少的系统调用,一下询问所有的IO状态,不是一次次的询问IO 的状态(与内核询问),减少了用户态和内核态切换的过程。

目前流行的多路复用I/O的实现主要包括四种:select、poll、epoll、kqueue。如下表所示是它们的一些重要特性的比较。

多路复用器 Select poll 是阻塞的,其实就是把文件描述符放在jvm 的内存中开辟了一个数组,如果是epoll 就是调用了 epoll_create 放到了内核空间。

“Netty入门知识点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Netty入门知识点有哪些

本文链接: https://www.lsjlt.com/news/295740.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Netty入门知识点有哪些
    本篇内容介绍了“Netty入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java NIO再说Netty 之前先简单了解下Ja...
    99+
    2023-06-19
  • linux入门知识点有哪些
    这篇文章给大家分享的是有关linux入门知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。linux目录架构 / 根目录 /bin 常用的命令 binary file 的目錄 /boot 存放系统启动时必...
    99+
    2023-06-13
  • FreeMarker入门知识点有哪些
    本文小编为大家详细介绍“FreeMarker入门知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeMarker入门知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。FreeMarker是...
    99+
    2023-06-26
  • Redux入门知识点有哪些
    这篇文章主要为大家展示了“Redux入门知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redux入门知识点有哪些”这篇文章吧。Redux是什么?一个...
    99+
    2024-04-02
  • DIV入门知识点有哪些
    本篇内容介绍了“DIV入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!DIV入门简介DIV ...
    99+
    2024-04-02
  • PHP入门知识点有哪些
    小编给大家分享一下PHP入门知识点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、 首要条件你首先必须要有一个正在工作着的支持PHP的web服务...
    99+
    2023-06-17
  • JRuby入门知识点有哪些
    本篇内容主要讲解“JRuby入门知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JRuby入门知识点有哪些”吧!一、JRuby入门引言Ruby是现在编程界讨论得正热火朝天的一种语言。这...
    99+
    2023-06-17
  • shell入门知识点有哪些
    这篇文章主要讲解了“shell入门知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell入门知识点有哪些”吧!背景一句话概括就是:shell编程就是对一堆Linux命令的逻辑化...
    99+
    2023-06-28
  • Git入门知识点有哪些
    今天小编给大家分享一下Git入门知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。版本控制什么是版本控制(版本迭代,...
    99+
    2023-06-29
  • ThinkPHP6.0入门知识点有哪些
    本篇内容主要讲解“ThinkPHP6.0入门知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThinkPHP6.0入门知识点有哪些”吧!一.框架介绍ThinkPHP是一个免费开源的,快...
    99+
    2023-07-02
  • html入门知识点有哪些
    本文小编为大家详细介绍“html入门知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“html入门知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。   一、...
    99+
    2024-04-02
  • jQuery入门知识点有哪些
    这篇文章主要介绍“jQuery入门知识点有哪些”,在日常操作中,相信很多人在jQuery入门知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jQuery入门知识点有...
    99+
    2024-04-02
  • ReactJs入门知识点有哪些
    本篇内容主要讲解“ReactJs入门知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ReactJs入门知识点有哪些”吧!   一、ReactJS简介...
    99+
    2024-04-02
  • JSF入门知识点有哪些
    本篇内容主要讲解“JSF入门知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JSF入门知识点有哪些”吧!JSF是java web 的标准,可能会取代jsp 时代。JSF直译过来就是Ja...
    99+
    2023-06-17
  • Django入门知识点有哪些
    本篇内容介绍了“Django入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Django入门:基本知识熟悉python和dja...
    99+
    2023-06-18
  • TypeScript入门知识点有哪些
    这篇文章主要介绍“TypeScript入门知识点有哪些”,在日常操作中,相信很多人在TypeScript入门知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Type...
    99+
    2024-04-02
  • Redis入门知识点有哪些
    这篇文章主要介绍“Redis入门知识点有哪些”,在日常操作中,相信很多人在Redis入门知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis入门知识点有哪些”...
    99+
    2024-04-02
  • VB入门知识点有哪些
    本篇内容介绍了“VB入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、VB入门教程VB与Basic VB之所以叫做“Visu...
    99+
    2023-06-17
  • HTML5+CSS3入门知识点有哪些
    这篇文章主要介绍“HTML5+CSS3入门知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“HTML5+CSS3入门知识点有哪些”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • redis的入门知识点有哪些
    这篇文章给大家分享的是有关redis的入门知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类ke...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作