Java实现基于NIO的多线程Web服务器实例

 更新时间:2020年03月13日 08:34:02   作者:yuanyb  
在本篇文章里小编给大家整理的是关于Java实现基于NIO的多线程Web服务器实例内容,需要的朋友们可以学习下。

代码地址:https://github.com/iyuanyb/webserver

实现了

静态、动态资源获取;

Cookie、Session、HTTP 长连接,及 Session 和 HTTP 长连接的定时清除;

类似 Spring MVC 的注解式编程,如 @RequestMapping @RequestParam 等,方法中可以根据参数名从前台获取数据,可以传递对象,也支持级联属性,如:

// GET /page?pageSize=10&pageNum=1 HTTP/1.1
@RequestMapping("/page")
String page(@RequestParam(value="pageSize", defaultValue="10") Integer pageSize, Integer pageNum) {...}
 
/**
 * POST /login HTTP/1.1
 * ...
 * user.name=admin&user.passwd=admin&user.data.val=ok
 * *******
 * User 类:String name; String passwd; Data data;
 * Data 类: String val;
 */
@RequestMapping("/login", method = HttpMethod.POST)
String login(User user) {...}

方法可以返回一个字符串表示模板路径,模板使用正则实现,仅可以从 request 和 session 域中获取属性值,如 ${request.user.id};

日志记录(使用 java.util.logging 内置日志记录器,自定义了日志格式):服务器运行相关日志(server-n.log),HTTP 请求日志(access-n.log)。

API 汇总:

@Controller
@RequestMapping
@RequestParam
@RequestHeader
@CookieValue
HttpRequest
HttpResponse
HttpSession
Cookie
HttpMethod

使用方法

导入 jar 包(见 release)即可使用相关注解,还需要在 classpath 下创建一个 webapp 目录,表示静态 web 资源的根路径。然后在主类的 main 方法中调用 BootStrap.run(),由于扫描控制器是通过遍历目录实现的,所以项目不支持打包,必须以 class 文件的形式发布。参数配置需要在 classpath 中提供一个 server-config.properties 配置文件即可,包含如下配置项:

# 服务器端口
PORT=80
# 存储日志文件的路径
LOG_FILE_STORAGE_PATH=E:\\
# 连接过期时间,单位毫秒
CONNECTION_EXPIRY_TIME=30000
# 清理过期连接的周期,单位毫秒
CONNECTION_CLEANING_CYCLE=30000
# Session 过期时间,单位毫秒
SESSION_EXPIRY_TIME=30000
# 清理过期 Session 的周期,单位毫秒
SESSION_CLEANING_CYCLE=30000
# 监听客户端读事件的线程数目
POLLER_THREAD_COUNT=2
# 处理具体请求的线程池的大小
REQUEST_PROCESSOR_THREAD_COUNT=4

演示

项目结构

EchoController.java

package com.test;
 
// 导包省略...
 
@Controller // 只有被 @Controller 标记的才会被认为是控制器
      // 支持在类上使用 @RequestMapping 注解,
public class EchoController {
 
  // 线程安全
  private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
  @RequestMapping("/echo") // 映射到 "/echo"
  public String echo(HttpRequest request, @RequestParam(value = "msg", defaultValue = "输入为空") String msg) {
 
    LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(request.getSession().getLastAccessedTime() / 1000, 0, ZoneOffset.ofHours(8));
    request.setAttribute("lastAccessedTime", localDateTime.format(formatter));
    request.setAttribute("msg", msg);
    return "test.html"; // 要渲染的的模板路径(classpath:webapp/test.html)
  }
 
  public static void main(String[] args) {
    BootStrap.run();
  }
}

test.html

<!DOCTYPE>
<html lang="en">
  <head>
    <title>Test</title>
  </head>
  <body>
    <p>Echo: ${request.msg}</p>
    <p>Last Accessed Time: ${request.lastAccessedTime}</p>
    <p><img src="img/girl.jpg" alt="girl" width="320" height="480"/></p>
  </body>
</html>

关于实例图片,GitHub暂时失效,后期脚本之家小编会补充进去。

到此这篇关于Java实现基于NIO的多线程Web服务器实例的文章就介绍到这了,更多相关Java 实现一个的基于 NIO 的多线程Web服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java递归实现拼装多个api的结果操作方法

    java递归实现拼装多个api的结果操作方法

    本文给大家分享java递归实现拼装多个api的结果的方法,说白了就是好几个API结果拼装成的,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-09-09
  • Mac上配置JDK 1.8的超详细流程

    Mac上配置JDK 1.8的超详细流程

    相信每个拿到MAC的小伙伴都是很欣喜的,但是由于MAC系统与WIN系统有着极大的不同,所以使用起来会有一些小困扰,这篇文章主要给大家介绍了关于Mac上配置JDK 1.8的超详细流程,需要的朋友可以参考下
    2023-11-11
  • Maven安装与配置图文教程

    Maven安装与配置图文教程

    这篇文章主要为大家详细介绍了Maven安装与配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • SpringBoot之logback-spring.xml不生效的解决方法

    SpringBoot之logback-spring.xml不生效的解决方法

    这篇文章主要介绍了SpringBoot之logback-spring.xml不生效的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 30分钟入门Java8之方法引用学习

    30分钟入门Java8之方法引用学习

    在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法,这篇文章主要介绍了30分钟入门Java8之方法引用学习,有兴趣可以了解一下。
    2017-04-04
  • Java命令设计模式优雅解耦命令和执行提高代码可维护性

    Java命令设计模式优雅解耦命令和执行提高代码可维护性

    本文介绍了Java命令设计模式,它将命令请求封装成对象,以达到解耦命令请求和执行者的目的,从而提高代码可维护性。本文详细阐述了该模式的设计原则、实现方法和优缺点,并提供了实际应用场景和代码示例,帮助读者深入理解和应用该模式
    2023-04-04
  • 浅谈Java中return和finally的问题

    浅谈Java中return和finally的问题

    在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家众说纷纭,有的说会执行,有的说不会执行,到底哪种说法正确,下面我们来详细讨论下
    2015-10-10
  • 如何写好一个Spring组件的实现步骤

    如何写好一个Spring组件的实现步骤

    这篇文章主要介绍了如何写好一个Spring组件的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java 生成随机验证码图片的示例

    Java 生成随机验证码图片的示例

    这篇文章主要介绍了Java 生成随机验证码图片的示例,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-10-10
  • java使用CKEditor实现图片上传功能

    java使用CKEditor实现图片上传功能

    这篇文章主要为大家详细介绍了java使用CKEditor实现图片上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论