「java的nio框架」Javanio

博主:adminadmin 2022-11-24 18:48:08 114

本篇文章给大家谈谈java的nio框架,以及Javanio对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

为什么说Java NIO 是非阻塞的

NIO之前的IO流要实现非阻塞得用户程序创建线程实现,每个线程内部用阻塞判断IO中断.而线程太占资源.不适用于IO高并发.为解决线程太占资源问题还提供了线程池框架.但也没完全解决IO高并发问题.

NIO框架则采取用户程序将IO需求注册入NIO框架,NIO框架用单线程循环查询全部IO需求,并分派响应IO需求.这样的好处是减少了高并发时的线程切换.用户程序编程上看没有阻塞的方法调用.

为什么选择Netty作为基础通信框架

一、什么是Netty

Netty是一个高性能 事件驱动、异步非堵塞的IO(NIO)Java开源框架,Jboss提供,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器,快速开发高性能、高可靠性的网络服务器和客户端程序。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已经被很多高性能项目作为其Socket底层基础,如HornetQ Infinispan Vert.x Play Framework Finangle和 Cassandra。其竞争对手是:Apache MINA和 Grizzly。

也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

“快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

二、不选择Java原生NIO编程的原因

首先开发出高质量的NIO程序并不是一件简单的事情,除去NIO固有的复杂性和BUG不谈,作为一个NIO服务端,还需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等情况,如果你没有足够的NIO编程经验积累,一个NIO框架的稳定往往需要半年甚至更长的时间。更为糟糕的是,一旦在生产环境中发生问题,往往会导致跨节点的服务调用中断,严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非正常停机会带来巨大的损失。

从可维护性角度看,由于NIO采用了异步非阻塞编程模型,而且是一个I/O线程处理多条链路,它的调试和跟踪非常麻烦,特别是生产环境中的问题,我们无法进行有效的调试和跟踪,往往只能靠一些日志来辅助分析,定位难度很大。

现在我们总结一下为什么不建议开发者直接使用JDK的NIO类库进行开发,具体原因如下。

1)跨平台与兼容性:NIO算是底层的APIs需依赖系统的IO APIs。但Java NIO发现在不同系统平台会出现问题。大量测试也耗不少时间;NIO2只支持JDK1.7+,而且没提供DatagramSocket,故NIO2不支持UDP协议。而Netty提供统一接口,同一语句无论在JDK6.X 还是JDK7.X 都可运行,无需关心底层架构功能!

2)JAVA NIO的ByteBuffer构造函数私有,无法扩展。Netty提供了自己的ByteBuffer实现,通过简单APIs对其进行构造、使用和操作,一此解决NIO的一些限制。

3)NIO对缓冲区的聚合与分散操作可能会导致内存泄漏。直到JDK1.7才解决此问题。

4)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

5)使用JAVA NIO需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。

6)可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题。

7)JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK 1.6版本的update18修复了该问题,但是直到JDK 1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有得到根本性解决。该BUG以及与该BUG相关的问题单可以参见以下链接内容。

异常堆栈如下。

java.lang.Thread.State: RUNNABLE

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)

at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)

- locked 0x0000000750928190 (a sun.nio.ch.Util$2)

- locked 0x00000007509281a8 (a java.util.Collections$ UnmodifiableSet)

- locked 0x0000000750946098 (a sun.nio.ch.EPollSelectorImpl)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)

at net.spy.memcached.MemcachedConnection.handleIO(Memcached Connection.java:217)

at net.spy.memcached.MemcachedConnection.run(MemcachedConnection. java:836)

由于上述原因,在大多数场景下,不建议大家直接使用JDK的NIO类库,除非你精通NIO编程或者有特殊的需求。在绝大多数的业务场景中,我们可以使用NIO框架Netty来进行NIO编程,它既可以作为客户端也可以作为服务端,同时支持UDP和异步文件传输,功能非常强大。

有人能说清楚JAVA7 NIO NETTY IOCP之间的联系吗

早期网络访问的做法是,连接以后,就等待对方应答,对方没有应答,代码就会死在那里。这称为阻塞式通讯。

后来,java 1.4 开始引入了nio, nio是非阻塞式网络通讯. 其实可以理解为系统去扫描端口,如果有返回就处理,没有的话,代码就继续做别的事。

不过nio的编码比较麻烦,虽然性能好,可是很多代码还在用阻塞,因为代码简单,很多例子上也是socket的。

然后高丽人开发了apache的mina,可以快速开发nio。

后来高丽人离开apache,开发了netty,提供了另一种调用nio的framework。

现在mina和netty是最常用的nio框架。

至于iocp,这个是个系统级的实现,其实类似nio,不过是通过操作系统来实现的。而且只支持windows。java 7以后把iocp引入,提供了快速开发的接口。不过不是很推荐使用。系统实现就表示iocp不再是跨平台的。那么实用性就差很多了。

java nio框架netty客户端连接成功后为什么会自动掉线

其实不要太迷信nio。这个东西如果你使用不当,效率还不如io高。 而且,使用了nio会造成和以前的代码的不兼容。 当然,你是高手,那就例外了。

如何学习Java的NIO?

Java NIO 是一种非阻塞式I/O。

要理解 NIO,要先理解 非阻塞式I/O。

非阻塞式I/O 只是众多 IO 模型中的一种。

要透切理解 非阻塞式I/O,就要理解众多 IO 模型的历史和优劣。

要理解为什么会出现 这么多 IO 模型。

就要理解 计算机的 IO 系统和 操作系统如何处理 IO的。

java的nio框架的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Javanio、java的nio框架的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-24,除非注明,否则均为首码项目网原创文章,转载请注明出处。