Netty也支持AIO并提供了相应的类: AioEventLoopGroup
,AioCompletionHandler
, AioServerSocketChannel
,AioSocketChannel
, AioSocketChannelConfig
。
其它使用方法和NIO类似。
Netty对缓冲区的扩展io.netty.buffer和java.nio.ByteBuffer的区别
官方文档Using as a generic library描述了两者的区别,主要还是友好性,扩展和性能的考虑。
http://zizihaier.iteye.com/blog/1767409也提到:
ByteBuffer主要有两个继承的类分别是:HeapByteBuffer和MappedByteBuffer。他们的不同之处在于HeapByteBuffer会在JVM的堆上分配内存资源,而MappedByteBuffer的资源则会由JVM之外的操作系统内核来分配。DirectByteBuffer继承了MappedByteBuffer,采用了直接内存映射的方式,将文件直接映射到虚拟内存,同时减少在内核缓冲区和用户缓冲区之间的调用,尤其在处理大文件方面有很大的性能优势。但是在使用内存映射的时候会造成文件句柄一直被占用而无法删除的情况,网上也有很多介绍。
Netty中使用ChannelBuffer来处理读写,之所以废弃ByteBuffer,官方说法是ChannelBuffer简单易用并且有性能方面的优势。在ChannelBuffer中使用ByteBuffer或者byte[]来存储数据。同样的,ChannelBuffer也提供了几个标记来控制读写并以此取代ByteBuffer的position和limit,分别是:
0 <= readerIndex <= writerIndex <= capacity,同时也有类似于mark的markedReaderIndex和markedWriterIndex。当写入buffer时,writerIndex增加,从buffer中读取数据时readerIndex增加,而不能超过writerIndex。有了这两个变量后,就不用每次写入buffer后调用flip()方法,方便了很多。
Netty的零拷贝(zero copy)
Netty的“零拷贝”主要体现在如下三个方面:
1) Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
2) Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。
3) Netty的文件传输采用了transferTo(JDK关于NIO的API中有使用)方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。
参考:
http://colobu.com/2014/11/13/java-aio-introduction/
http://www.uml.org.cn/j2ee/2014060411.asp
http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf
相关推荐
**Netty5 AIO 深度解析** Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。AIO(Asynchronous Input/Output,异步I/O)在Java中是通过NIO.2 API实现的,它...
本文将深入探讨BIO( Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架中的线程模型,并与TCP网络协议相结合,为您提供全网最全面的解析。 首先,让我们从基础开始,了解这些I/O...
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...
《构建Java AIO网络框架:探索 Getty 框架与 Netty 的相似之处》 在IT行业中,网络框架是构建高性能、高并发服务器应用的重要工具。Netty作为一款广泛使用的异步事件驱动的网络应用程序框架,深受开发者喜爱。然而...
### BIO、NIO、AIO、Netty 面试题解析 #### 1. Java IO 基础概述 Java中的I/O操作是通过流(Stream)来实现的,所有的数据都通过流的方式被串行化处理。串行化的含义在于数据必须按顺序输入输出。Java中的IO操作...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 的核心概念、特性以及它在网络编程中的应用,特别是针对多Socket服务器集成...
【网络通信:Netty、BIO、NIO与AIO详解】 在计算机科学中,网络通信是实现系统间数据交换的关键技术。Java平台提供了多种I/O模型来支持网络通信,包括传统的阻塞I/O(BIO)、非阻塞I/O(NIO)以及异步I/O(AIO)。...
在Java开发领域,BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O)以及Netty框架是网络编程中的重要概念,对于Java开发工程师来说,理解并掌握这些技术是必不可少的。以下是对这些知识点的...
包含了Netty,NIO AIO,Mina知识的详解以及netty结合spring protocolbuf的源码
1. **异步非阻塞通信**:Netty基于Java NIO技术实现,通过使用异步非阻塞IO(AIO)和多路复用技术,能够在一个线程中处理多个客户端连接,极大地提高了系统的并发处理能力。 - **NIO多路复用模型**:如图2-3所示...
### 2024年Java常见BIO、NIO、AIO、Netty面试题解析 #### 一、基础知识概述 1. **IO概念**: - Java中的I/O(Input/Output)指的是输入输出操作,它以流为基础进行数据的输入输出。所有的数据在Java中都是以流的...
Netty选择NIO而不是AIO是因为: 1. 性能考虑:在Linux系统上,AIO的性能并未超过NIO(epoll),且AIO的实现没有达到预期的效果。 2. 缓存分配问题:AIO需要预分配缓存,而NIO则根据实际接收数据动态分配,对于连接...
进一步发展,AIO(Asynchronous IO,也称为NIO.2)引入了异步非阻塞IO,允许应用程序注册感兴趣的IO事件,并在事件发生时通过回调函数进行处理,提高了系统效率。 Netty正是基于NIO设计的,但Netty对NIO进行了许多...
Netty最新jar包,里面有源码,需要的朋友可以下载。。。
t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重开发一线工程师的感受,提供了大量和业务相关的API。基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、...
Netty 4.1.52.Final杰克逊 2.10.1JUnit 5.5.2示例包含示例如下Java标准I/O实现Echo服务器、客户端Java NIO实现Echo服务器、客户端Java AIO实现Echo服务器、客户端Netty实现Echo服务器、客户端Netty 实现 丢弃服务器...
《Netty权威指南》是由李林锋编著的一本深入探讨Netty框架的专业书籍,由电子工业出版社出版。这本书详细介绍了Netty的核心概念、设计模式以及实战应用,旨在帮助读者全面掌握这一高性能、异步事件驱动的网络应用...