package com.smoner.java.nio.test; import java.io.IOException; 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.Iterator; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by smoner on 2020/2/17. */ public class NioServer { private int port; private Selector selector; private ExecutorService service = Executors.newFixedThreadPool(5); public static void main(String[] args){ new NioServer(8080).start(); } public NioServer(int port) { this.port = port; } public void init() { ServerSocketChannel ssc = null; try { ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.bind(new InetSocketAddress(port)); selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT); System.out.println("NioServer started ......"); } catch (IOException e) { e.printStackTrace(); }finally { } } public void accept(SelectionKey key) { try { ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); SocketChannel sc = ssc.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); System.out.println("accept a client : " + sc.socket().getInetAddress().getHostName()); } catch (IOException e) { e.printStackTrace(); } } public void start() { this.init(); while (true) { try { int events = selector.select(); if (events > 0) { Iterator<SelectionKey> selectionKeys = selector.selectedKeys().iterator(); while (selectionKeys.hasNext()) { SelectionKey key = selectionKeys.next(); selectionKeys.remove(); if (key.isAcceptable()) { accept(key); } else { service.submit(new NioServerHandler(key)); } } } } catch (IOException e) { e.printStackTrace(); } } } public static class NioServerHandler implements Runnable{ private SelectionKey selectionKey; public NioServerHandler(SelectionKey selectionKey) { this.selectionKey = selectionKey; } public void run() { try { if (selectionKey.isReadable()) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); socketChannel.read(buffer); buffer.flip(); System.out.println("收到客戶端"+socketChannel.socket().getInetAddress().getHostName()+"的數據:"+new String(buffer.array())); //將數據添加到key中 ByteBuffer outBuffer = ByteBuffer.wrap(buffer.array()); socketChannel.write(outBuffer);// 將消息回送給客戶端 selectionKey.cancel(); } } catch (IOException e) { e.printStackTrace(); } } } }
package com.smoner.java.nio.test; import java.io.IOException; 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.Iterator; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by smoner on 2020/2/17. */ public class NioServer { private int port; private Selector selector; private ExecutorService service = Executors.newFixedThreadPool(5); public static void main(String[] args){ new NioServer(8080).start(); } public NioServer(int port) { this.port = port; } public void init() { ServerSocketChannel ssc = null; try { ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.bind(new InetSocketAddress(port)); selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT); System.out.println("NioServer started ......"); } catch (IOException e) { e.printStackTrace(); }finally { } } public void accept(SelectionKey key) { try { ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); SocketChannel sc = ssc.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); System.out.println("accept a client : " + sc.socket().getInetAddress().getHostName()); } catch (IOException e) { e.printStackTrace(); } } public void start() { this.init(); while (true) { try { int events = selector.select(); if (events > 0) { Iterator<SelectionKey> selectionKeys = selector.selectedKeys().iterator(); while (selectionKeys.hasNext()) { SelectionKey key = selectionKeys.next(); selectionKeys.remove(); if (key.isAcceptable()) { accept(key); } else { service.submit(new NioServerHandler(key)); } } } } catch (IOException e) { e.printStackTrace(); } } } public static class NioServerHandler implements Runnable{ private SelectionKey selectionKey; public NioServerHandler(SelectionKey selectionKey) { this.selectionKey = selectionKey; } public void run() { try { if (selectionKey.isReadable()) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); socketChannel.read(buffer); buffer.flip(); System.out.println("收到客戶端"+socketChannel.socket().getInetAddress().getHostName()+"的數據:"+new String(buffer.array())); //將數據添加到key中 ByteBuffer outBuffer = ByteBuffer.wrap(buffer.array()); socketChannel.write(outBuffer);// 將消息回送給客戶端 selectionKey.cancel(); } } catch (IOException e) { e.printStackTrace(); } } } }