nio-选择器

package UDPDemo;

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

public class DateServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		//表示5个监听端口
		int []ports = new int[]{8001,8002,8003,8004,8005,8006};
		//通过open方法找到selector
		Selector selector = Selector.open();
		for(int i=0;i<ports.length;i++){
			//打开服务器的通道
			ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
			//设置服务器为非阻塞
			serverSocketChannel.configureBlocking(false);
			//实例化绑定地址,端口
			InetSocketAddress addr = new InetSocketAddress(ports[i]);
			//服务器开始监听地址
			serverSocketChannel.bind(addr);
			//注册等待事件
			serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
			System.out.println("服务器开始监听:"+ports[i]+" 端口");
			 
		}
		//要接收全部生成的key,并通过连接进行判断是否获取客户端的输出
		int keysAdd = 0;
		//选择一组键,并且相应的通道已经打开
		while((keysAdd = selector.select())>0){
			//取出全部的键
			Set<SelectionKey> selectionKeys = selector.selectedKeys() ;
			Iterator<SelectionKey> iterator = selectionKeys.iterator();
			while(iterator.hasNext()){
				SelectionKey key = iterator.next();
				if(key.isAcceptable()){
					//
					ServerSocketChannel server = (ServerSocketChannel) key.channel();//取得对应的服务器通道
					//获取客户端
					SocketChannel client =  server.accept(); 
					//设置非阻塞
					client.configureBlocking(false);
					ByteBuffer  bf = ByteBuffer.allocate(1024);
					bf.put(("当前时间为:"+new Date()).getBytes());
					bf.flip();
					client.write(bf);
					client.close();
				}
			}
			selectionKeys.clear();
			
		}

	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值