NIO的工作方式(一)

package com.yyj.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
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 NIODemo {
	
	public void selector() throws IOException{
		
		ByteBuffer buffer = ByteBuffer.allocate(1024); //定義一個緩衝區數組長度爲1024
		//打開選擇器
		Selector selector = Selector.open();
		ServerSocketChannel ssc = ServerSocketChannel.open();
		
		ssc.configureBlocking(false);//設置爲非阻塞方式
		
		ssc.socket().bind(new InetSocketAddress(8080));
		ssc.register(selector, SelectionKey.OP_ACCEPT); //註冊監聽事件
		while(true){
			Set selectedKeys = selector.selectedKeys();//取得所有key集合
			Iterator it =  selectedKeys.iterator();
			while(it.hasNext()){
				SelectionKey key = (SelectionKey) it.next();
				
				if((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT){
					ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();
					SocketChannel sc = ssChannel.accept();
					sc.configureBlocking(false);
					sc.register(selector, SelectionKey.OP_READ);
					it.remove();
				}else if((key.readyOps() & SelectionKey.OP_READ)  == SelectionKey.OP_READ){
					SocketChannel sc = (SocketChannel) key.channel();
					while(true){
						buffer.clear();
						int n = sc.read(buffer);
						if(n<0){
							break;
						}
						
						buffer.flip();
					}
					it.remove();
				}
				
				
				
				
				
				
				
				
				
				
				
			}
		}
		
	}
	
	
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章