前文介绍了传统IO的WEB经典服务器 reactor模式前序:传统IO的WEB服务器设计

下面看看JAVA NIO的WEB服务器设计

NIO是基于事件驱动的,对于NIO来说,重要组件是Selector,其服务器代码为:

 1 /*
2 * 流程总结:
3 * 1.初始时,只对accept事件感兴趣,selectionkey只有accept事件
4 * 2.当有连接进来时,处理完accept之后,对读事件感兴趣,selectionkey增加键read
5 * 3.不断循环selectionkey的键集合
6 */
7
8 Selector selector = Selector.open();
9 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
10 serverSocketChannel.configureBlocking(false); // 设置为非阻塞
11
12 // 绑定监听端口号
13 serverSocketChannel.bind(new InetSocketAddress(8899));
14
15 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 对连接事件感兴趣
16
17 while (true) {
18 Set<SelectionKey> keys = selector.selectedKeys();
19
20 Iterator<SelectionKey> iterator = keys.iterator();
21
22 while(iterator.hasNext()) {
23 SelectionKey selectionKey = iterator.next();
24
25 if(selectionKey.isAcceptable()) {
26 ServerSocketChannel serverSocketChannel1 = (ServerSocketChannel) selectionKey.channel();
27 SocketChannel socketChannel = serverSocketChannel1.accept(); // 此处阻塞
28 socketChannel.configureBlocking(false);
29
30 socketChannel.register(selector, SelectionKey.OP_READ);
31
32 iterator.remove();
33 } else if(selectionKey.isReadable()) { // 完成功能:从客户端接收数据并且原样返回给客户端
34 SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
35
36 while (true) {
37 ByteBuffer byteBuffer = ByteBuffer.allocate(512);
38 byteBuffer.clear();
39 int read = socketChannel.read(byteBuffer);
40
41 if(read <= 0) {
42 break; // 数据已接收完毕
43 }
44
45 byteBuffer.flip();
46 socketChannel.write(byteBuffer);
47
48 }
49
50 iterator.remove();
51
52 }
53
54
55 }
56
57 }
 

reactor模式前序(二):NIO WEB服务器设计的更多相关文章

  1. reactor模式前序:传统IO的WEB服务器设计

    先看一段经典的WEB JAVA服务器设计 JAVA代码为(伪代码) 1 ServerSocket serverSocket = ...; 2 serverSocket.bind(8899); 3 4 ...

  2. reactor模式与java nio

     Reactor是由Schmidt, Douglas C提出的一种模式,在高并发server实现中广泛採用. 改模式採用事件驱动方式,当事件出现时,后调用对应的事件处理代码(Event Handl ...

  3. [作业向]tinyhttp web服务器设计及完整代码

    最近看了<HTTP权威指南>和<UNP>有了写一个简单的web服务器的想法,正好这个学期没有什么课,所以就花了一个星期这样写了一个出来,鉴于本人水平有限,如果有什么设计或代码错 ...

  4. 外网访问VMware(Centos7.0,NAT模式)搭建的web服务器应用

    首先参考         https://www.cnblogs.com/studyhard-cq/p/11551755.html 设置好NAT模式,能访问公网. 1.打开VMware,点击左上角编辑 ...

  5. 高性能服务器开发基础系列 (二)Reactor模式

    系列目录 第01篇 主线程与工作线程的分工 第02篇 Reactor模式 第03篇 一个服务器程序的架构介绍 第04篇 如何将socket设置为非阻塞模式 第05篇 如何编写高性能日志 第06篇 关于 ...

  6. 关于Web服务器的认识

    马上就要毕业了,也要开始找工作了,大学写了这么多代码了,却没有好好总结一下常用的概念很是遗憾额,就通过这篇博客记录一下我最常用的一些知识好了. 说到Web服务器,有很多文章都介绍的很好,之前看到一篇非 ...

  7. nginx web服务器详解1(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeloda.blog.51cto.com/2033581/1285332 大 ...

  8. Netty(七):EventLoop学习前导——Reactor模式

    了解Netty的人多少都会知道Netty的高性能的一个原因就是它是基于事件驱动的,而这一事件的原型就是Reactor模式. 所以在学习EventLoop前,很有必要先搞懂Reactor模式. 本文目录 ...

  9. web服务器的原理

    一:什么是web服务器 web服务器是可以向浏览器等Web客户端提供文档的计算机的程序.当web浏览器连接到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何 ...

随机推荐

  1. linux下gdb命令大全

    感谢国内的ACM同行们的支持,今年应该会是难忘的一年,谢谢大家的帮助啦 gdb命令如下,记全!!!

  2. AlanShan数据库课程设计报告

    目    录 1.绪论.... 2 1.1前言... 2 1.2社会背景... 2 1.3超市背景... 3 2.系统可行性研究.... 4 2.1 技术可行性研究... 4 2.2 经济可行性研究. ...

  3. Python MoviePy中文教程导览及可执行音视频剪辑工具下载

    ☞ ░ 前往老猿Python博文目录 ░ <Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载>是老猿两个关于moviepy的专栏<PyQt+moviepy ...

  4. 第7.6节 Python中类的继承机制详述

    在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...

  5. 解读 authentication.py

    """ Provides various authentication policies. """ import base64 import ...

  6. 【面试】关于get和post两种方法的不同。

    最近在面试题和笔试题中经常会看到这道题,所以打算系统的整理一下. 一般标准的答案是这样的. GET在浏览器回退时是无害的,而POST会再次提交请求(浏览器应该告知用户数据会被重新提交). GET产生的 ...

  7. 团队项目6——Alpha阶段项目复审

    复审团队 广东靓仔六强选手 复审员 钟俊豪(3118005122) 复审内容 小组名称和链接 优点 缺点&Bug报告 最终排名 代码敲不队https://www.cnblogs.com/pip ...

  8. 算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)

    题目 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销? Kruskal算法 特点 适用于稀疏图,时间复杂度 是nlogn的. 核心思想 从小到大选取不会产生环的边. 代码实现 代码中 ...

  9. CSS知识点记录

    1.浏览器style中显示的样式 这里面的样式,是行内样式或者是使用js添加的样式

  10. Python爬虫之BeautifulSoup库

    1. BeautifulSoup 1.1 解析库 1)Python标准库 # 使用方法 BeautifulSoup(markup, "html.parser") # 优势 Pyth ...