NIO使用非阻塞IO的方式实现,服务器与客户端的交流,适用于大量连接,而数据量少的情况。通过一个线程轮询所有的通道,处理注册的事件,而主线程可以继续干其他的事情。这样所有的I/O都交给一个线程处理,减少了线程IO的切换。如果具体学习NIO的架构和原理请点击下面的连接
点击打开链接 http://ifeve.com/selectors/
以下为一个使用NIO实现的C/S通信模式,对应简单例子学习,可以更容易入手。
服务端代码如下:
主线程类:MainChannel
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
public class MainChannel {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 声明服务器监听通道 和select选择器
ServerSocketChannel serverChannel = null;
Selector selector = null;
try {
// 实例化selector 此种实例化模式说明 selector 是单例的
selector = Selector.open();
// 实例化服务器监听端口
serverChannel = ServerSocketChannel.open();
// 绑定监听地址。
serverChannel.socket().bind(new InetSocketAddress(8881));
// 设置channel为非阻塞模式,一定要非阻塞模式才能注册到selector中
serverChannel.configureBlocking(false);
// 把监听通道注册到选择器中, 监听此通道的连接事件。SelectionKey.OP_ACCEPT 指定为连接事件。
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
//所有通道,