Java课程设计——使用JAVA实现简易HTTP服务器
- 项目简介
- 项目简介
- 项目功能架构图
- 项目采用技术
- 功能需求分析
- 核心功能分析
- 功能需求分析
- 额外需求
- 项目亮点(创新点)
- 项目结构亮点
- 项目稳定性与容错性亮点
- 功能亮点
- 项目规范亮点
- 项目美化亮点
- 团队成员负责模块
- 主要功能截图、系统演示操作视频及静态修正
- 主要功能截图及说明
- core包
- http包
- 系统演示操作视频
- 静态修正过程
- git
- 项目git地址(内含readme.md)
- 使用Issue进行任务发布及团队成员git提交记录截图
- 总结
项目简介
项目简介
本项目为2 人小组 Java 课程设计,使用Java Socket网络编程实现简易的多线程HTTP服务器。可以正常响应客户端(浏览器)的GET与POST,根据浏览器指定访问的URL获取服务器上相应的网页文件(.html)并返回,同时还进行了页面设计与美化以及技术上的拓展创新。
项目功能架构图
下图为本项目分包分层的功能架构图
项目采用技术
1.底层网络:Java Socket、ServerSocket、IO 字节流、线程池(多线程并发处理客户端)
2.Web 协议:HTTP1.1 协议解析,GET/POST 请求处理
3.设计模式:工厂模式分层处理请求、面向对象、分包独立开发
4.持久化:本地文件存储 HTML 静态页面、服务器访问日志
5.第三方工具:阿里 Java 代码静态扫描工具
6.协作工具:双人分模块开发,使用git提交代码和issue发布任务,分支协同完成代码
功能需求分析
核心功能分析
本项目核心功能为实现简易HTTP服务器。项目核心功能实现网络监听、多线程并发、请求解析、页面响应等。系统支持多客户端浏览器并发访问、解析HTTP协议、自动返回对应界面或错误提示页面。
功能需求分析
1.底层功能需求
(1)实现多线程并发处理需求,支持多浏览器同时访问、同时处理,解决单线程所具有的阻塞问题。
(2)本项目需要对端口进行绑定、对客户端实现监听(持续监听客户端浏览器的TCP连接请求),并为不同客户端分配独立的线程。
(3)本项目需要对每一次的浏览器访问都实现独立处理,单次运行异常不能影响整体服务器的运行,因此需要对客户端每次访问的会话生命周期进行管理。
(4)本项目需要实现异常容错与稳定运行的需求,接收由业务模块中返回的提示错误页面。
2.业务功能需求
(1)实现 HTTP 报文解析需求
本项目需要读取浏览器原始 HTTP 报文,自动解析提取请求方式、访问路径、协议信息等,同时对GET、POST参数进行解析,接收从底层模块中传递来的客户端数据,实现解析业务要求。
(2)实现静态资源响应需求
本项目需要根据用户输入的请求路径,读取到对应的HTML页面,并组装以标准HTTP响应头与页面显示内容,进而返回完整的HTTP响应数据。
(3)实现对错误访问的响应
本项目需要实现对错误数据的相应。当用户访问不存在的资源路径或使用不允许的请求方式时,应该予以识别并返回相应的提示信息,以便用户更改请求。
额外需求
1.兼容性需求
要实现多平台兼容的需求,就要求本项目不通过IDE等软件运行,而是打包成jar文件,在任何平台和软件上都可稳定运行,兼容性强。
2.稳定性需求
本项目需要能够稳定运行,因此在本项目中采用了资源自动释放、异常捕捉以及拦截空请求等机制,并给出提示语句,以便用户更改指令。
3.可扩展性需求
为了方便在后期对项目功能进行扩展,实现可扩展性需求,本项目采用分包分层架构,使核心功能与业务功能耦合程度低,以便扩展。
4.可维护性需求
为了实现项目的高可维护性,在项目设计过程中对关键的类与方法进行了注释并生成注释文档,且进行明确的代码分工,便于团队维护与错误纠正。
项目亮点(创新点)
项目结构亮点
1.本项目使用分层分包结构,core包与http包分包设计,使项目开发可以同时进行,使网络监听、线程并行等底层功能与HTTP协议解析、页面响应等业务功能隔离设计,团队协作效率高。
2.使用线程池实现多线程并发结构,解决了单线程阻塞缺陷的问题,统一管理客户端的连接,实现资源复用,不需要频繁创建和销毁线程。
3.单独设计ServerConfig类用于固定项目常量参数,使得别类的设计不再有零散的数字数据,结构更清晰。且在后期若需要对常量进行修改,不需要更改核心代码,只需要对ServerConfig类中的常量进行修改,可维护性高。
项目稳定性与容错性亮点
1.本项目实现了多种异常捕获,如网络连接超时异常、输入输出读写异常等,且使用了分级异常捕获,当单次浏览器访问出现异常时,只会终止当前访问,不会使整个服务器系统报错,使项目运行更加稳定,容错性更高。
2.本项目实现了统一的资源关闭方法,且在关闭时分层释放资源,所以在长期运行时不会出现内存相关问题。
3.本项目实现了对空请求和无效连接的提前检测,避免运行时的错误。
4.本项目实现了对多个访问时可能出现的错误的检测,如错误的请求方式、错误的访问路径、访问频繁等。
功能亮点
一.底层模块
1.对客户端访问进行日志化处理,保存访问数据以供查询。可以自动记录每一次客户端访问的信息,包括访问时间、客户端IP地址以及要访问的资源路径。
2.对实现的功能进行可视化打印,方便进行出现错误时的代码定位。
3.实现连接超时自动结束机制,为Socket设置读取时长限制,当长时间无数据传输时自动结束线程,避免了对线程池的占用。
4.实现请求耗时自动统计,单次会话结束后自动计算完整处理耗时,区分秒、毫秒单位输出,全部运行结束后也会输出耗时,直观观测服务器处理每条请求的性能消耗,便于性能优化分析。
二.业务模块 1.分层校验双层防护:
资源不存在:路径读取不到html文件时,自动加载404.html页面,返回 404 状态码,提示用户资源缺失;
请求方式非法:当使用POST 访问非表单路径或提出put/delete等不允许的请求时,加载405.html页面,返回 405 状态码;
两种异常场景对错误分别响应,给用户清晰提示,完成错误响应业务需求。
2.采用原生 IO 读取静态页面,搭配 try-with-resources 语法自动释放文件流,无需手动关闭资源,从底层避免文件占用、内存泄漏问题,程序长时间运行稳定性更强。
4.用户填完表单提交后,服务器得到填写的账号、密码,替换结果页面里预设的文字并展示出来。不需要搭建数据库存数据,靠简单文替换就能实现提交内容回显。
5.服务器只允许两种正常访问方式:GET 看网页、POST 提交表单。如果用户用 DELETE、PUT 这类别的方式访问页面,服务器会直接拦截,弹出错误页面,限制了不规范的访问操作。
6.用户只输入网址根路径时,程序会自动匹配首页文件,不用手动输入 index.html;同时统一处理路径"/",防止拼接路径出错,用户访问更方便。
项目规范亮点
1.对关键性类和方法进行代码注释,并生成注释文档,增强了代码的可读性与可维护性,方便项目成员之间的同步与交接。
2.严格遵守了HTTP协议要求的请求头格式以及标准化返回。
项目美化亮点
在实现标准化功能的基础上,还对页面进行了美化设计,使项目更美观、简洁大方,便于清晰查看结果,具有创新性。
1.全部页面统一基础排版样式,字体、间距、配色协调统一,首页、表单页、报错页面视觉风格保持一致,整体观感整洁规范。
2.表单页面布局规整,输入框、提交按钮分区摆放,输入区域大小适配文字填写,操作界面直观清晰,降低用户操作成本。
3.404、405 错误页面单独设计提示文案,搭配清晰文字说明问题原因,页面不会空白单调,用户能快速明白访问失败的缘由。
4.表单提交结果页做了内容分区,区分标签文字与用户填写的数据,展示层次分明,提交的账号、备注信息一目了然。
5.页面适配中文显示,搭配后端统一 UTF-8 编码处理,所有文字无乱码,标题、提示文字阅读舒适。
6.按钮添加基础交互视觉区分,普通按钮与功能按钮有明显区分,页面交互感更强,区分可点击区域。
团队成员负责模块
| 成员 | 负责模块 | 功能说明 |
|---|---|---|
| 组长 | HttpServer类 | 服务启动入口,端口监听,线程池管理,全局监控,服务启停与资源释放 |
| 组长 | ClientHandler类 | 单客户端连接线程,Socket IO 读写,请求路由,限流、白名单和封禁校验,分发页面响应 |
| 组长 | ServerConfig类 | 全局统一配置常量,IP统计容器,页面白名单、并发限制,缓存容器定义 |
| 组长 | LogUtil类 | 日志文件初始化,分级控制台打印,访问日志、异常日志和停机汇总日志持久化 |
| 组员 | HttpRequest类 | 拆分请求行与请求头,解析GET链接参数、读取 POST 表单内容并完成 URL 解码,提取客户端完整请求信息 |
| 组员 | HttpResponse类 | 管理响应状态码、拼接响应头部、装载页面内容作为响应体,组装完整合规的HTTP报文返回浏览器。 |
| 组员 | HttpParseUtil类 | 通用解析工具类,提供字符串分割、表单参数提取、换行符处理等基础公用解析方法。 |
| 组员 | RequestHandlerFactory类 | 基于工厂模式识别请求类型,分别分发GET静态页面访问、POST表单提交两套处理流程。 |
| 组员 | FileUtil类 | 读取本地html页面文件,适配访问路径匹配,捕获文件缺失异常,统一采用 UTF-8 编码读取避免中文乱码。 |
主要功能截图、系统演示操作视频及静态修正
主要功能截图及说明
对实现主要核心功能的代码进行统一整合。
core包
1.HttpServer类
核心功能:开启端口监听、多线程池处理客户端、后台清理IP缓存、运行监控、程序停止时释放资源。
2.ClientHandler类
核心功能:IP 限流、封禁、路径安全校验、解析HTTP请求、返回页面响应,配合异常反馈
3.ServerConfig类
核心功能:集中管理端口、线程、限流、黑白名单、全局IP统计容器
4.LogUtil类
核心功能:控制台彩色日志、本地文件持久化访问/异常日志、自动创建资源文件夹
http包
1.FileUtil类
转换网页访问路径,拼接本地真实文件地址,校验文件,合法则调用读文件方法,无文件返回null;用UTF-8编码读取HTML文件,拼接页面全部文字并返回,读取失败返回空。
2.HttpParseUtil类
分割请求行、请求头字符串;解析表单参数,做 URL 解码;判断是 GET 还是POST,校验表单类型、读取请求头信息
3.HttpRequest类
解析HTTP请求,提取请求方式、路径、GET与POST表单参数
4.HttpResponse类
封装HTTP响应,设置状态码、响应头与页面内容,拼接完整响应报文;根据路径读取页面资源,自动返回200正常页面或404页面。
5.RequestHandlerFactory类
分发处理各类请求,GET无资源返回 404,POST替换占位符渲染页面,非法请求返回 405。
系统演示操作视频
系统功能演示操作视频
静态修正过程
1.首先消除原生警告,得到初步修正后的代码
2.使用阿里巴巴静态修正工具进行修正,并再次扫描
可以看出已无错误,对代码进行静态扫描修正完成。
git
项目git地址(内含readme.md)
项目git地址
使用Issue进行任务发布及团队成员git提交记录截图
使用Issue进行任务发布截图:
成员git提交记录截图:
组长(负责core包底层模块):
组员(负责http包业务模块):
总结
本项目采用 Java 实现轻量多线程 HTTP 服务器,代码分 core、http 两个核心包分层开发。
http 包封装 HTTP 通信基础实体:HttpRequest完成原始请求报文解析,提取请求路径、请求方法;HttpResponse封装响应状态码、页面内容输出逻辑;RequestHandlerFactory作为工厂类统一分发请求处理,标准化 HTTP 收发流程。
core 包实现服务调度与工具能力:HttpServer为主服务入口,借助线程池并发处理 Socket 连接,搭配定时任务清理 IP 访问缓存,实现限流封禁;ClientHandler处理单客户端请求,完成路径校验、异常拦截;LogUtil类统一管理日志持久化,自动创建文件目录。开发中依据阿里代码规范整改所有警告,抽取重复代码、清理冗余未使用方法、修复 sleep 繁忙等待、文件返回值忽略等问题。项目完整实现请求解析、并发调度、访问管控、日志记录整套 Web 服务流程,代码结构清晰规范。
通过本次项目设计,我们对Java的基础知识进行了练习,获得了更深刻的理解,同时学习了新的关于HTTP协议以及页面设计的知识,为后续的学习打下了坚实基础。