传统的阻塞IO我就不多说,因为之前我发过几篇使用传统阻塞IO做QQ聊天写的几篇文章,服务器端每得到一个新的连接就开一个线程,在这个线程中接收数据方向是阻塞的,
这种方式对性能的开销是非常大的,总结来说如果连接的数量非常多,并且每个连接发送的数据非常少的情况,不要使用传统阻塞IO,推荐使用Java
NIO模式
传统的阻塞IO适用于连接的数量非常少,且传输的数据量非常大情况,这种可以考虑使用传统的阻塞IO
JDK的无阻塞I/O有效解决多线程服务器线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对
每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个CPU的处理能力和处理中的等待时间,达到提高服务能力的目的。
Java NIO 中select()阻塞,等待有事件发生唤醒
Java NIO
中,一般ServerSocketChannel只注册accept事件,对于read和write事件是注册到accept的SocketChannel中的
所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞(None
Blocking)。
通道介绍:这里主要介绍ServerSocketChannel和
SocketChannel.它们都是可选择的(selectable)通道,分别可以工作在同步和异步两种方式下(注意,这里的可选择不是指可以选择两种工作方式,而是指可以有选择的注册自己感兴趣的事件)。可以用channel.configureBlocking(Boolean
)来设置其工作方式。与以前版本的API相比较,ServerSocketChannel就相当于ServerSocket(ServerSocketChannel封装了ServerSocket),而SocketChannel就相当于Socket(SocketChannel封装了Socket)。
FR:徐海涛(Hunk Xu)