NIO应用

来源:互联网 发布:大数据分析道与术 编辑:程序博客网 时间:2024/06/14 16:29

NIO:

1,为所有的原始类型提供buffer缓存支持。

2,字符集编码解码解决方案。

3,channel 一个新的IO对象。

4,支持锁和内存映射文件的文件访问接口。

5,提供多路非阻塞式的高伸缩性网络IO

package thread;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NIO {
    int[] port;
    private void execute() throws IOException{
        //创建一个新的选择器
        Selector selector = Selector.open();
        //打开每个端口的监听,并向给定的选择器注册此通道接收客户端连接的IO事件
        for(int i =0 ;i<port.length;i++){
            //打开服务器套接字通道
            ServerSocketChannel ssc = ServerSocketChannel.open();
            //设置此通道为非阻塞式
            ssc.configureBlocking(false);
            //绑定到特定地址
            ServerSocket ss = ssc.socket();
            InetSocketAddress add = new InetSocketAddress(port[i]);
            ss.bind(add);
            //向给定的选择器注册此通道的连接事件
            ssc.register(selector,SelectionKey.OP_ACCEPT);
            System.out.println(port[i]);
        }
        while(true){
            //这个方法会阻塞,直到至少有一个已注册的事件发生。当一个或者更多的事件发生时,此方法将返回所发生的事件的数量。
            int num = selector.select();
            //迭代所有选择键,以处理特定的IO事件
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> iter = selectionKeys.iterator();
            SocketChannel sc;
            while(iter.hasNext()){
                SelectionKey key = iter.next();
                if((key.readyOps()&SelectionKey.OP_ACCEPT)==SelectionKey.OP_ACCEPT){
                    ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
                    sc = ssc.accept();
                    sc.configureBlocking(false);
                    sc.register(selector, SelectionKey.OP_READ);
                    iter.remove();
                }else if((key.readyOps()&SelectionKey.OP_READ)==SelectionKey.OP_READ){
                    sc = (SocketChannel) key.channel();
                    int byteEchoed = 0;
                    ByteBuffer echoBuffer = ByteBuffer.allocate(1024);
                    while(true){
                        echoBuffer.clear();
                        int r = sc.read(echoBuffer);
                        if(r == -1){break;}
                        echoBuffer.flip();
                        sc.write(echoBuffer);
                        byteEchoed+=r;
                    }
                    iter.remove();
                }
                
            }
            
        }
        
        
    }
}


原创粉丝点击