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
输出如下: