大家好,今天小编关注到一个比较有意思的话题,就是关于java网络编程nio教程的问题,于是小编就整理了2个相关介绍Java网络编程nio教程的解答,让我们一起看看吧。
如何学习JAVA的NIO?
我们知道在生活中,等人是一件很烦的事,同样,在代码中等待(阻塞)不仅影响性能,降低效率,而且还极大的浪费***!
在J***A4之前,J***A的IO模型为blocking IO(BIO),即阻塞IO,在连接建立后,如果没有数据传输就会一直处于阻塞状态,这时候从线程来看就处于休眠状态,从CPU来看就是处于停滞状态,极大的浪费CPU的计算能力,如果以这个模型开发应用,则因为大量线程阻塞,占用内存***大,导致有效连接数很低,比如说一个J***A线程占用1m的内存,那么一个8G的内存顶多支持8000个连接,这对动辄百万玩家在线游戏等长连接模型,肯定是不能处理的!
J***A在4版本,引进了NIO(Non-Blocking IO),即非阻塞IO,如何才能做到非阻塞呢?
如果发起了几千个连接,但是只有几个连接需要数据传输,使用BIO需要维持几千个连接,但是NIO是***触发机制,启动一个线程不断的对连接进行循环,如果有需要数据传输的就进行处理,如果没有,继续循环,这样只需要一个线程就能维持几千的连接,内存消耗相比BIO十分的低!
既然NIO如此高效,那么怎么学习J***A NIO呢?
1,明白NIO原理:BIO通常以字节流或者字符流进行数据传输,而NIO使用bufffer缓冲,channel管道,selector选择器进行核心实现!
channel负责数据的传输,有不同的管道类型,比如文件管道FileChannel,一般从流(输入或者输出)获取到管道(getChannel()方法)!
buffer作为数据的缓冲,能一次性大量的传输数据,避免了单个字节写数据的低效率,通常buffer有容量capacity,数据总量limit,指向专属位置position,记录上次读写位置的标志mark四个指标,对应相应的同名函数作为调用方法,实现对缓冲中数据指标的获取,再使用put,get方法从缓冲区设置或者获取数据!
掌握NIO相应的API!
2,学习netty:netty作为J***A NIO的最流行框架,其思想被广泛应用在诸如nginx,redis等著名的框架中,netty作为一个同步非阻塞IO模型,通过IO多路复用将需要处理的***放入一个FIFO队列,然后逐一处理,使用linux中的epoll模型,避免selector模型中对所有连接的轮询,性能更加的高效!
J***A7 NIO NETTY IOCP之间的联系是什么?
早期网络访问的做法是,连接以后,就等待对方应答,对方没有应答,代码就会死在那里。这称为阻塞式通讯。 后来,j***a 1.4 开始引入了nio, nio是非阻塞式网络通讯. 其实可以理解为系统去扫描端口,如果有返回就处理,没有的话,代码就继续做别的事。不过nio的编码比较麻烦,虽然性能好,可是很多代码还在用阻塞,因为代码简单,很多例子上也是socket的。然后高丽人开发了apache的mina,可以快速开发nio。后来高丽人离开apache,开发了netty,提供了另一种调用nio的framework。现在mina和netty是最常用的nio框架。至于iocp,这个是个系统级的实现,其实类似nio,不过是通过操作系统来实现的。而且只支持windows。j***a 7以后把iocp引入,提供了快速开发的接口。不过不是很推荐使用。系统实现就表示iocp不再是跨平台的。那么实用性就差很多了。
到此,以上就是小编对于j***a网络编程nio教程的问题就介绍到这了,希望介绍关于j***a网络编程nio教程的2点解答对大家有用。