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

 

posted @ 2018-07-30 09:24  甜菜波波  阅读(426)  评论(0编辑  收藏  举报