1、创建NioNest12类
一个线程监听5个端口的事件
public class NioTest12 {
public static void main(String[] args) throws Exception {
int[] ports = new int[5];
ports[0] = 5000;
ports[1] = 5001;
ports[2] = 5002;
ports[3] = 5003;
ports[4] = 5004;
Selector selector = Selector.open();
for(int i = 0; i < ports.length; ++i){
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
ServerSocket serverSocket = serverSocketChannel.socket();
InetSocketAddress address = new InetSocketAddress(ports[i]);
serverSocket.bind(address);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("监听端口:" + ports[i]);
}
while (true){
int numbers = selector.select();
System.out.println("numbers:" + numbers);
Set<SelectionKey> selectionKeys = selector.selectedKeys();
System.out.println("selectedKeys: " + selectionKeys);
Iterator<SelectionKey> iter = selectionKeys.iterator();
while (iter.hasNext()){
SelectionKey selectionKey = iter.next();
//判断是否有客户端连接
if(selectionKey.isAcceptable()){
ServerSocketChannel serverSocketChannel = (ServerSocketChannel)selectionKey.channel();
SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
iter.remove();
System.out.println("获得客户端连接:" +socketChannel);
}
//判断是否有可读的数据
else if(selectionKey.isReadable()){
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
int bytesRead = 0;
while (true){
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
int read = socketChannel.read(byteBuffer);
if(read <= 0){
break;
}
byteBuffer.flip();
socketChannel.write(byteBuffer);
bytesRead += read;
}
System.out.println("读取:" + bytesRead +", 来源于:" + socketChannel);
iter.remove();
}
}
}
}
}
启动NioTest12,监听如下五个端口

使用命令行访问
2、telnet localhost 5000,并发送hello wold

输出如下:

3、telnet localhost 5001,并发送hello wold

输出如下:
