前面已经把NIO的三大组件介绍了一篇,接下去是一个完整的例子:
Server端
public class NioServer { //用于存储客户端对应的SocketChanel private static Map<String,SocketChannel> mapClient = new ConcurrentHashMap<>(); public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); ServerSocket serverSocket = serverSocketChannel.socket(); serverSocket.bind(new InetSocketAddress(8899)); Selector selector = Selector.open(); serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT); while(true){ try{ int i = selector.select(); Set<SelectionKey> selectionKeys = selector.keys(); System.out.println(i); Iterator<SelectionKey> iterator = selectionKeys.iterator(); while (iterator.hasNext()){ final SocketChannel client; SelectionKey selectionKey =iterator.next(); if(selectionKey.isAcceptable()){ ServerSocketChannel serverSocketChannel1 = (ServerSocketChannel) selectionKey.channel(); client = serverSocketChannel1.accept(); client.configureBlocking(false); client.register(selector,SelectionKey.OP_READ); String key = "["+UUID.randomUUID().toString()+"]"; mapClient.put(key,client); }else if (selectionKey.isReadable()){ client = (SocketChannel) selectionKey.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); int count = client.read(readBuffer); if(count > 0){ readBuffer.flip(); Charset charset = Charset.forName("utf-8"); String receivedMessage = String.valueOf(charset.decode(readBuffer).array()); System.out.println(receivedMessage); String sendKey = null; for (Map.Entry<String,SocketChannel> entry:mapClient.entrySet()){ if (entry.getValue().equals(client)){ sendKey = entry.getKey(); break; } } //广播: for (Map.Entry<String,SocketChannel> entry:mapClient.entrySet()){ SocketChannel value = entry.getValue(); ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put((sendKey+"发送消息:"+receivedMessage).getBytes()); buffer.flip(); value.write(buffer); } } } } selectionKeys.clear(); }catch (Exception e){ e.printStackTrace(); } } } }
Client端:
public class NioClient { public static void main(String[] args) throws IOException { SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); Selector selector = Selector.open(); socketChannel.register(selector,SelectionKey.OP_CONNECT); socketChannel.connect(new InetSocketAddress("127.0.0.1",8899)); while(true){ selector.select(); Set<SelectionKey> selectionKeySet = selector.keys(); for (SelectionKey selectionKey:selectionKeySet){ if (selectionKey.isConnectable()){ SocketChannel client = (SocketChannel)selectionKey.channel(); if (client.isConnectionPending()){ client.finishConnect(); ByteBuffer writeBuffer = ByteBuffer.allocate(10213); writeBuffer.put("你好啊".getBytes()); writeBuffer.flip(); socketChannel.write(writeBuffer); } socketChannel.register(selector,SelectionKey.OP_READ); }else if (selectionKey.isReadable()){ SocketChannel socketChannel1 = (SocketChannel) selectionKey.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(512); int read = socketChannel.read(readBuffer); if (read>0){ String recivedMessage = new String(readBuffer.array(),0,read); System.out.println(recivedMessage); } } } } } }