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服务器
原文地址:https://www.cnblogs.com/tiancai/p/9388907.html