码迷,mamicode.com
首页 > Web开发 > 详细

使用nio实现web服务器

时间:2018-07-30 11:19:03      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:move   net   ati   select   str   nec   int   imp   cti   

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

 

使用nio实现web服务器

标签:move   net   ati   select   str   nec   int   imp   cti   

原文地址:https://www.cnblogs.com/tiancai/p/9388907.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!