Java中怎么实现NIO非阻塞网络编程


这篇文章将为大家详细讲解有关Java中怎么实现NIO非阻塞网络编程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。缓冲区本质上是一个可以写入数据的内存块(类似数组),然后可以再次读取。此内存块包含在NIO Buffer对象中,该对象提供了一组方法,可以更轻松的使用内存块。
相对于直接操作数组,Buffer API提供了更加容易的操作和管理,其进行数据的操作分为写入和读取,主要步骤如下:将数据写入缓冲区调用buffer.flip(),转换为读取模式缓冲区读取数据调用buffer.clear()或buffer.compact()清除缓冲区Buffer中有三个重要属性:capacity(容量):作为一个内存块,Buffer具有一定的固定大小,也称为容量
position(位置):写入模式时代表写数据的位置,读取模式时代表读取数据的位置
limit(限制):写入模式等于Buffer的容量,读取模式时等于写入的数据量Buffer使用代码示例:ByteBuffer为性能关键型代码提供了直接内存(direct,堆外)和非直接内存(heap,堆)两种实现。堆外内存实现将内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理,而不是虚拟机,这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响,提供运行的速度。堆外内存的获取方式: ByteBuffer byteBuffer = ByteBuffer.allocateDirect(noBytes)堆外内存的好处:进行网络IO或者文件IO时比heap buffer少一次拷贝。(file/socket — OS memory — jvm heap)在写file和socket的过程中,GC会移动对象,JVM的实现中会把数据复制到堆外,再进行写入。GC范围之外,降低GC压力,但实现了自动管理,DirectByteBuffer中有一个Cleaner对象(PhantomReference),Cleaner被GC执行前会执行clean方法,触发DirectByteBuffer中定义的Deallocator堆外内存的使用建议:性能确实可观的时候才去使用,分配给大型,长寿命的对象(网络传输,文件读写等场景)通过虚拟机参数MaxDirectMemorySize限制大小,防止耗尽整个机器的内存Channel用于源节点与目标节点之间的连接,Channel类似于传统的IO Stream,Channel本身不能直接访问数据 香港云主机,Channel只能与Buffer进行交互。Channel的API涵盖了TCP/UDP网络和文件IO,常用的类有FileChannel,DatagramChannel,SocketChannel,ServerSocketChannel标准IO Stream通常是单向的(InputStream/OutputStream),而Channel是一个双向的通道,可以在一个通道内进行读取和写入,可以非阻塞的读取和写入通道,而且通道始终读取和写入缓冲区(即Channel必须配合Buffer进行使用)。SocketChannel用于建立TCP网络连接,类似java.net.Socket。有两种创建SocketChannel的形式,一个是客户端主动发起和服务器的连接,还有一个就是服务端获取的新连接。SocketChannel中有两个重要的方法,一个是write()写方法,write()写方法有可能在尚未写入内容的时候就返回了,需要在循环中调用write()方法。还有一个就是read()读方法,read()方法可能直接返回根本不读取任何数据,可以根据返回的int值判断读取了多少字节。核心代码代码示例片段:ServerSocketChannel可以监听新建的TCP连接通道,类似ServerSocket。ServerSocketChannel的核心方法accept()方法,如果通道处于非阻塞模式,那么如果没有挂起的连接,该方法将立即返回null,实际使用中必须检查返回的SocketChannel是否为null。核心代码示例片段:Selector也是Java NIO核心组件,可以检查一个或多个NIO通道,并确定哪些通道已经准备好进行读取或写入。实现单个线程可以管理多个通道,从而管理多个网络连接。一个线程使用Selector可以监听多个Channel的不同事件,其中主要有四种事件,分别对应SelectionKey中的四个常量,分别为:连接事件 SelectionKey.OP_CONNECT准备就绪事件 SelectionKey.OP_ACCEPT读取事件 SelectionKey.OP_READ写入事件 SelectionKey.OP_WRITESelector实现一个线程处理多个通道的核心在于事件驱动机制,非阻塞的网络通道下,开发者通过Selector注册对于通道感兴趣的事件类型,线程通过监听事件来触发相应的代码执行。(更底层其实是操作系统的多路复用机制)核心代码示例片段:服务端代码示例:客户端代码示例:关于Java中怎么实现NIO非阻塞网络编程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

相关推荐: win7系统无法打开桌面图标怎么解决

这篇文章主要为大家分析了win7系统无法打开桌面图标怎么解决的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“win7系统无法打开桌面图标怎么解决”的知识吧。在win7系统中,所安…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/30 16:17
下一篇 07/30 16:17

相关推荐