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);
            }
        }
    }
  • 相关阅读:
    Java 排序(快排,归并)
    Java 编译???
    装箱 拆箱
    Integer-->String String-->Integer
    java 内部类
    Java 反射机制
    Java 多态的实现机制
    一个句子,找出最字符最少的关键词
    重载、重写
    数组有没有length()这个方法? String有没有length()这个方法?
  • 原文地址:https://www.cnblogs.com/tiancai/p/9388907.html
Copyright © 2011-2022 走看看