NIO单线程编写高性能、高并发服务器

原文地址 : http://blog.163.com/sean_zwx/blog/static/16903275520121254102918/

 在传统的java网络编程中,都是在服务端创建一个ServerSocket,然后为每一个客户端单独创建一个线程Thread分别处理各自的请求,由于对于CPU而言,线程的开销是很大的,无限创建线程会让操作系统崩溃,因此,比较好的方法是在系统启动的时候创建一个动态的线程池,例如鼎鼎大名的服务器Tomcat,就是采用这种解决方案,然而,这种解决方案在高并发的情况下,情况就不太乐观了,当线程池大小超过CPU瓶颈的时候,相应速度,就极其低下了。

传统的java网络编程的结构图如下

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog
 
 
 
       在JDK1.4后,java引入的NIO的概念,即非阻塞的IO,服务端无需创建多个线程,仅仅只需要1个线程(将读写分别创建线程有利于提高性能)即可以处理全部客户端,解决了在性能和并发的2大问题。

       NIO采用了通道Channel和选择器Selector的核心对象,Select 机制,不用为每一个客户端连接新启线程处理,而是将其注册到特定的Selector 对象上,这就可以在单线程中利用Selector 对象管理大量并发的网络连接,更好的利用了系统资源;采用非阻塞I/O 的通信方式,不要求阻塞等待I/O 操作完成即可返回,从而减少了管理I/O 连接导致的系统开销,大幅度提高了系统性能。

当有读或写等任何注册的事件发生时,可以从Selector 中获得相应的SelectionKey , 从SelectionKey 中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据。由于在非阻塞网络I/O 中采用了事件触发机制,处理程序可以得到系统的主动通知,从而可以实现底层网络I/O 无阻塞、流畅地读写,而不像在原来的阻塞模式下处理程序需要不断循环等待。使用NIO,可以编写出性能更好、更易扩展的并发型服务器程序。

     NIO的结构如下

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 由此可见,服务端最少只需要一个线程,既可以处理所有客户端Socket

NIO的设计原理

       设计原理有点像设计模式中的观察者模式,由Selector去轮流咨询各个SocketChannel通道是否有事件发生,如果有,则选择出所有的Key集合,然后传递给处理程序。我们通过每个key就可以获取客户端的SocketChannel,从而进行通信。

       如果Selector发现所有通道都没有事件发生,则线程进入睡眠状态Sleep,阻塞。等到客户端有事件发生,会自动唤醒wakeup选择器selector,是不是有点类似观察者模式!!!!

 

 

 

好下面通过一个案例,来说明NIO的通信机制

 

先看服务端程序

首先定义通信数据包DataPacket

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 

 

 

核心NIO服务

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog
NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog
NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog
NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 

 

最后是测试程序

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 

 

 

 

 

 

下面是客户端程序

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog
NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 

 

 

运行结果

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 

NIO单线程编写高性能、高并发服务器 - Seans Blog - Seans Blog

 

 

 

这就是Java  NIO机制,具有网络跨时代的意义,apache的顶级项目Mina就是采用Java NIO机制,目前Tomcat7也增加的NIO的实现,可见NIO的力量是非常强大的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值