jdk nio 服务器

引言

在学习netty之前咱们须要理解nio,于是我就想分享一下如何用jdk nio写一个服务

流程

步骤1:关上一个服务管道(Channel),并设置非阻塞模式
步骤2:创立服务
步骤3:关上一个多路复用器,并注册到Channel,对ACCEPT事件感兴趣
步骤4:轮询抉择多路复用器,针对不同的复用器进行相干的操作(读、写)

public class NoUseNettyNio {    public void serve(int port) throws IOException {        //关上一个ServerSocketChannel        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();        //设置一个serverSocketChannel为不阻塞模式,即nio        serverSocketChannel.configureBlocking(false);        //通过serverSocketChannel获取serverSocket        ServerSocket serverSocket = serverSocketChannel.socket();        //创立一个server的网卡地址对象        InetSocketAddress address = new InetSocketAddress(port);        //为serverSocket绑定网卡地址        serverSocket.bind(address);        //关上一个selector(多路复用器)        Selector selector = Selector.open();        //将多路复用器注册到serverSocketChannel(管道)上        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);        //创立一个byteBuffer        ByteBuffer buffer = ByteBuffer.wrap(("HTTP/1.1 200 OK\r\n" +                "        Content-Type: text/html;charset=UTF-8\r\n").getBytes(StandardCharsets.UTF_8));        for (; ; ) {            try {                //抉择一个通道,此办法是阻塞的,在有一个通道、线程中断或Selector的唤醒时,返回                selector.select();            } catch (IOException e) {                e.printStackTrace();                break;            }            //获取的一个selectKey汇合,该汇合只能删除不能增加,            Set<SelectionKey> selectionKeys = selector.selectedKeys();            Iterator<SelectionKey> iterator = selectionKeys.iterator();            while (iterator.hasNext()) {                SelectionKey key = iterator.next();                iterator.remove();                try {                    if (key.isAcceptable()) {                        ServerSocketChannel server = (ServerSocketChannel) key.channel();                        SocketChannel client = server.accept();                        client.configureBlocking(false);                        client.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE,buffer.duplicate());                        System.out.println("Accepted connection from "+client);                    }                    if(key.isWritable()) {                        SocketChannel client = (SocketChannel) key.channel();                        ByteBuffer attachment = (ByteBuffer) key.attachment();                        while (buffer.hasRemaining()) {                            System.out.println(attachment.toString());                            if(client.write(attachment) == 0) {                                break;                            }                        }                        client.close();                    }                } catch (IOException e) {                    key.channel();                    try {                        key.channel().close();                    } catch (IOException ex) {                    }                    e.printStackTrace();                }            }        }    }    public static void main(String[] args) throws IOException {        NoUseNettyNio noUseNettyNio = new NoUseNettyNio();        noUseNettyNio.serve(8910);    }}