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); }}