java nio Selector(多路复用,异步阻塞)例子

package znio;

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.Date;
import java.util.Iterator;
import java.util.Set;

public class DataServer {

	public static void main(String[] args) throws Exception {
		
		int[] ports = {8001,8002,8003,8004,8005};
		Selector selector = Selector.open();
		
		for(int i=0; i<ports.length; i++){
			ServerSocketChannel ssc = ServerSocketChannel.open();
			ssc.configureBlocking(false);
			ServerSocket ss = ssc.socket();
			InetSocketAddress isa = new InetSocketAddress(ports[i]);
			ss.bind(isa);
			ssc.register(selector, SelectionKey.OP_ACCEPT);
			System.out.println("服务器运行,在端口" + ports[i] + "上监听!");
		}

		int keysAdd = 0;
		while((keysAdd = selector.select()) > 0){
			Set<SelectionKey> selectedKeys = selector.selectedKeys();
			Iterator<SelectionKey> iter = selectedKeys.iterator();
			while(iter.hasNext()){
				SelectionKey selectedKey = iter.next();
				if(selectedKey.isAcceptable()){
					ServerSocketChannel ssc = (ServerSocketChannel)selectedKey.channel();
					SocketChannel sc = ssc.accept();
					sc.configureBlocking(false);
					ByteBuffer bb = ByteBuffer.allocate(1024);
					bb.put(("server response time: " + new Date()).getBytes());
					bb.flip();
					sc.write(bb);
					sc.close();
				}
			}
			selectedKeys.clear();
		}
	}

}

猜你喜欢

转载自kinghoo.iteye.com/blog/2300701