zoukankan      html  css  js  c++  java
  • 使用nio实现web服务器

    package com.nio;
    
    import java.io.IOException;
    import java.net.InetAddress;
    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.Date;
    import java.util.Iterator;
    import java.util.Set;
    
    public class NIOServer {
        public static void main(String[] args) throws IOException, InterruptedException {
            Selector selector = Selector.open();
    
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8080);
            serverSocketChannel.socket().bind(address);
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            String content="";
            while (true) {
                if (selector.select() > 0) {
                    Set<SelectionKey> selectionKeys = selector.selectedKeys();
                    Iterator<SelectionKey> it = selectionKeys.iterator();
    
                    while (it.hasNext()) {
                        SelectionKey selectionKey = it.next();
                        if (selectionKey.isAcceptable()) {
                            serverSocketChannel = (ServerSocketChannel)selectionKey.channel();
                            SocketChannel socketChannel = serverSocketChannel.accept();
                            socketChannel.configureBlocking(false);
                            socketChannel.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
                            System.out.println("Connected: " + socketChannel.socket().getRemoteSocketAddress());
                        } else if (selectionKey.isReadable()) {
                            SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
                            ByteBuffer buffer = ByteBuffer.allocate(1024);
                            String msg="";
                            while (socketChannel.read(buffer) > 0) {
                                buffer.flip();
                                byte[] dis = new byte[buffer.limit()];
                                buffer.get(dis);
                                content+=new String(dis);
                                buffer.flip();
      msg+=new String(dis);
                                System.out.println("当前线程="+Thread.currentThread().getId()+"--"+new String(dis));
                            }
                            socketChannel.write(ByteBuffer.wrap((new Date()).toString().getBytes()));
                            socketChannel.close();
    
                        }
                        else  if (selectionKey.isWritable()){
    //                        String msg="";
    //                        SocketChannel  socketChannel=(SocketChannel)selectionKey.channel();
    //
    //                        socketChannel.write(ByteBuffer.wrap(("abc001"+msg).getBytes()));
    //                        socketChannel.close();
    
                        }
    
                        it.remove(); //若不删除,下次执行到selector.select 会持续返回0 造成 死循环
                    }
                }
    
                Thread.sleep(100);
            }
        }
    }
  • 相关阅读:
    帮助中心 7D-我的私家设计师 设计师品牌服饰集成网 7D服装定制!
    libiconv的静态编译
    “好饭不怕晚” 怎么理解这句话?_百度知道
    “好饭不怕晚” 怎么理解这句话?_百度知道
    隆庆祥_百度百科
    【图】高级西服定制、量身定制(英国/意大利进口面料商务着装、结婚礼服、高档衬衫)
    量身定制顺美男女西服、衬衫、大衣、T恤等
    高级西服定制
    关于我们-成功人士西装定制服务第一品牌派斯特PAISTETAILOR绅士礼服
    断舍离:日式概念的流行-财经网
  • 原文地址:https://www.cnblogs.com/tiancai/p/9388907.html
Copyright © 2011-2022 走看看