Java使用NioSocket手动实现HTTP服务器-创新互联
NioSocket简单复习
重要概念
NioSocket里面的三个重要概念:Buffer、Channel、Selector
- Buffer为要传输的数据
- Channel为传输数据的通道
- Selector为通道的分配调度者
使用步骤
使用NioSocket实现通信大概如以下步骤:
- ServerSocketChannel可以通过configureBlocking方法来设置是否采用阻塞模式,设置为false后就可以调用register注册Selector,阻塞模式下不可以用Selector。
- 注册后,Selector就可以通过select()来等待请求,通过参数设置等待时长,若传入参数0或者不传入参数,将会采用阻塞模式直到有请求出现。
- 接收到请求后Selector调用selectedKeys方法,返回SelectedKey集合。
- SelectedKey保存了处理当前请求的Channel和Selector,并提供了不同的操作类型。四种操作属性:SelectedKey.OP_ACCEPT、SelectedKey.OP_CONNECT、SelectedKey.OP_READ、SelectedKey.OP_WRITE。
- 通过SelectedKey的isAcceptable、isConnectable、isReadable和isWritable来判断操作类型,并处理相应操作。
- 在相应的Handler中提取SelectedKey中的Channel和Buffer信息并执行相应操作。
实现HTTP
创建HttpServer类作为程序的主要入口
public class HttpServer { public static void main(String[] args) throws Exception{ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress((8080))); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); // It must be ACCEPT, or it will throw exception serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while(true){ if (selector.select(3000) == 0){ continue; } IteratorkeyIter = selector.selectedKeys().iterator(); while (keyIter.hasNext()){ SelectionKey key = keyIter.next(); new Thread(new HttpHandler(key)).run(); keyIter.remove(); } } } }
本文标题:Java使用NioSocket手动实现HTTP服务器-创新互联
新闻来源:http://tyjierui.cn/article/dpcihg.html