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服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java web三件套listener、filter、servelt原理解析

    一.listener.filter.servelt 的执行顺序和生命周期 1.启动顺序 想知道 web 三大件的启动顺序其实只需要查看启动日志就好了,启动顺序为:listener.filter.servelt 2.生命周期 查看结束和运行时候的日志不难发现: 1> listener 的生命周期:一直从程序启动到结束,其中: ServletRequestListener (用来监控 session 的创建,销毁等):每次访问一个 Request 资源前,都会执行 requestInitialize

  • Java web xml文件读取解析方式

    其实解析xml文件有四种方式:DOM,JDOM,DOM4J,SAX. 我们来说与平台无关的两种官方解析方式:DOM 和 SAX 一.DOM 解析 在 Java 代码中,xml 文件是标记型文档,这时用 dom 来解析 xml 文件 dom 会根据 html 的层级结构在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 DOM 解析步骤: 1.使用 newInstance 方法,创建一个 DocumentBuilderFactory 的对象. 2.创建一个 DocumentBuil

  • 常见JavaWeb安全问题和解决方案

    1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击. 字符型注入:黑色部分为拼接的问题参数 select * from t_user where name='test' or '1' = '1'; 数字型注入:黑色部分为拼接的问题参数(对于强类型语言,字符串转int类型会抛异常.所以这种注入方式一般出现在php等弱类型语言上) select * from t_user where id=1:drop table t_userinfo;

  • JSP学习之Java Web中的安全控制实例详解

    本文实例讲述了JSP学习之Java Web中的安全控制.分享给大家供大家参考.具体如下: 一.目标: ① 掌握登录之后的一般处理过程: ② 能够为每个页面添加安全控制: ③ 能够共享验证代码: ④ 使用过滤器对权限进行验证: ⑤ 能够对文件的局部内容进行验证: ⑥ 掌握安全验证码的基本实现方式: ⑦ 通过异常处理增强安全性. 二.主要内容: ① 通过修改前面的登录功能,分别对管理员和普通用户的登录进行处理: ② 为管理员才能访问的页面添加控制: ③ 共享各个页面中的控制代码,使用专门的文件,然后

  • 详解CentOS安装tomcat并且部署Java Web项目

    1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图: b.因为tomcat的安装依赖于Java jdk,所以我们需要在判断linux系统下面是否安装jdk b.1 使用(Xshell)连接到Linux系统下面 b.2 输入命令:java -version,如果显示jdk版本号,则证明已经安装,如果不显示,则证明没有安装,如果没有安装,请参考下面地址进行安装:http://

  • centos上安装配置java WEB环境

    趁着十一期间,好好的写写随笔来记录自己所学.所践和所得,不足之处,欢迎各位拍砖~~~ 工具:Xftp 5.Xshell 5 一.安装jdk 1. 使用Xftp 5把jdk-8u65-linux-x64.tar.gz上传到centos服务器上.   2. 使用语句 tar -zxvf jdk-8u65-linux-x64.tar.gz -C 目的地址(如/usr/java/)   3. 使用语句 vim /etc/profile,添加以下语句     - export JAVA_HOME=/usr

  • 使用纯Java实现一个WebSSH项目的示例代码

    最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:GateOne.webssh.shellinabox等,这些项目都可以很好地实现webssh的功能,但是最终并没有采用,原因是在于这些底层大都是python写的,需要依赖很多文件,自己用的时候可以使用这种方案,快捷省事,但是做到项目中供用户使用时,总不能要求用户做到服务器中必须包含这些底层依赖,这显然不太合理,

  • linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境

    一.安装JDK 1.卸载旧版本或者系统自带的JDK (1)列出所有已安装的JDK rpm -qa | grep jdk (2)卸载不需要的JDK yum -y remove 安装包名称 2.下载并解压JDK (1)下载安装包 进入到/usr/local目录下新建java目录 mkdir java ,在Java目录下使用wget指令下载安装包,如 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2

  • 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 @Reques

  • java使用socket实现一个多线程web服务器的方法

    除了服务器类,还包括请求类和响应类 请求类:获取客户的HTTP请求,分析客户所需要的文件 响应类:获得用户请求后将用户需要的文件读出,添加上HTTP应答头.发送给客户端. 服务器处理类 package com.lp.app.webserver; import java.io.*; import java.net.*; //使用Socket创建一个WEB服务器,本程序是多线程系统以提高反应速度. class WebServer { public static String WEBROOT = "&

  • java实现一个简单的Web服务器实例解析

    Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类, java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信. 这个简单的Web服务器会有以下三个类: *HttpServer *Request *Response 应用程序的入口在HttpServer类中,main()方法创建一个HttpServer实例,然后调用其await()方法,顾名思义,await()方法会在指定端口上

  • Python命令启动Web服务器实例详解

    Python命令启动Web服务器实例详解 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m SimpleHTTPServer 8080 然后就可以在浏览器中输入 http://localhost:端口号/路径 来访问服务器资源. 例如: http://localhost:8080/index.htm(当然index.htm文件得自己创建) 其他机器

  • Java中常见的5种WEB服务器介绍

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomcat 服务器 目前最为流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servlet 技术的Web服

  • 基于php在各种web服务器的运行模式详解

    一.php在apache中运行模式 php在apache中一共有三种工作方式:CGI模式.FastCGI模式.Apache 模块DLL以下分别比较:1. CGI模式与模块模式比较:php在apache中两种工作方式的区别(CGI模式.Apache 模块DLL)这两种工作方式的安装:PHP 在 Apache 2.0 中的 CGI 方式ScriptAlias /php/ "c:/php/"AddType application/x-httpd-php .php# 对 PHP 4 用这行Ac

  • nodejs开发一个最简单的web服务器实例讲解

    开发一个最简单的http服务 require 引入http模块 创建http服务 侦听端口 实战案例 vim server.js // 使用JavaScript最严格的语法,防止出现一些问题 'use strict' // 引入http模块 var http = require("http"); // 创建一个服务 var app = http.createServer(function(req, res){ // 设置http头 res.writeHead(200, {"C

  • WEB服务器大比拼,评析六大流派

    摘要 有时候Apache给人的感觉是无处不在,每个人都在运行Apache,甚至包括它们的狗也运行有自己的Apache .但是即使如此,仍然有很多种其他的Web服务器可供选择.本文就对目前市场上主流Web服务器进行全面的比较. Apache无处不在,可以运行在包括Linux.Soloris等多种系统平台之上.Apache在网络市场是无可争议的领头羊.几乎在任何一本关于网络管理的教程中关于Web服务器内容讨论的都是Apache.当然选择Apache是由很多非常充足的原因的,毕竟一千六百万用户(根据N

  • 详解node.js创建一个web服务器(Server)的详细步骤

    前言 在 node.js 中创建一个服务器非常简单,只需要使用 node.js 为我们提供的 http 模块及相关 API 即可创建一个麻雀虽小但五脏俱全的web 服务器,相比 Java/Python/Ruby 搭建web服务器的过程简单的很. http model 要想创建一个基于 node.js 的 web 服务器,你就必须使用 node.js 提供的 http 模块,node.js 中的 http 接口旨在支持传统上难以使用的协议的许多特性, 特别是,大块的.可能块编码的消息,接口永远不会

  • Android Studio配合WampServer完成本地Web服务器访问的问题

    前言 初入Android Studio,在访问Web服务器时遇到的一些问题,特写此篇记录一下错误的解决. 一.WampServer服务器 初入Android Studio,在进行Web服务器的访问时要用到本地的Web服务器,通过WampServer实现. 本次使用的是WampServer 2.2版本,下载链接附在下方: 链接: https://pan.baidu.com/s/1STRuXrol0ZXCFkMTpmSOZw 提取码: 5x22 (有32位以及64位两个版本) 二.问题解析 1.图标

随机推荐