当前位置:首页 > 开发 > 互联网 > 正文

Java NIO 简单事件响应实现

发表于: 2014-08-09   作者:antlove   来源:转载   浏览次数:
摘要: com.nio.Server package com.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channel

com.nio.Server

package com.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
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 Server {
	private Selector selector = null;
	
	public Server() throws IOException{
		// register the server
		ServerSocketChannel ssc = ServerSocketChannel.open(); 
		ssc.configureBlocking(false);
		int port = 8080;
		InetSocketAddress endpoint = new InetSocketAddress(port );
		ssc.socket().bind(endpoint);
		selector = Selector.open();
		ssc.register(selector, SelectionKey.OP_ACCEPT);
	}
	
	public void start() throws IOException{
		while(true){
			int num = selector.select();
			
			if(num>0){
				Set<SelectionKey> selectionKeySet = selector.selectedKeys();
				Iterator<SelectionKey> iterator = selectionKeySet.iterator();
				while(iterator.hasNext()){
					SelectionKey key = iterator.next();
					iterator.remove();// must remove it
					
					if (key.isAcceptable()) {
						ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
						SocketChannel sc = serverSocketChannel.accept();
						sc.configureBlocking(false);
						sc.register(selector, SelectionKey.OP_READ);
						
					}else if (key.isReadable()) {
						System.out.println("do read ...");
						SocketChannel sc = (SocketChannel) key.channel();
						sc.register(selector, SelectionKey.OP_WRITE);
						
					}else if (key.isWritable()) {
						System.out.println("do write ...");
						SocketChannel sc = (SocketChannel) key.channel();
						sc.close();
						key.cancel();
					}
				}
			}
		}
	}
	
	
	public static void main(String[] args) throws Exception {
		new Server().start();
	}

}

com.nio.Client

package com.nio;

import java.io.IOException;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws IOException{
		System.out.println("client start ... ");
		
		Socket socket = new Socket("localhost",8080);
		
		socket.close();
		
		System.out.println("client end ... ");
	}
}

 

Note:

1. 在使用Iterator迭代SelectionKey的后,必须调用Iterator.remove(). 因为select()只会向selector所关联的键集合中添加元素,如果不移除每个处理过的键,它就会在下次select()方法时仍然保留在集合中。

2. 不要轻易使用SelectionKey.cancel(). cancel 会终止selector 和 key关联的Channel的联系。

 

Java NIO 简单事件响应实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
事件驱动模型的原理不再赘述,Swing是不错的实现。别人也有不错的博文来说明原理。 本文的目的是提
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,
在任何一款桌面应用中,都难免会遇到让用户输入文字或者特殊字符的情况发生,所以输入法的支持与文
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号