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();
}
}
}
nio-选择器
最新推荐文章于 2022-09-02 12:53:14 发布