Java使用NioSocket手动实现HTTP服务器-创新互联
NioSocket简单复习
创新互联建站凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、成都网站建设、网站设计、网站优化、软件开发、网站改版等服务,在成都10余年的网站建设设计经验,为成都上千余家中小型企业策划设计了网站。重要概念
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://azwzsj.com/article/dpcihg.html