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();
}
}
}
}
}