面向对象程序设计Java课程设计2026年06月26日一、项目简介功能描述本项目使用Java Socket网络编程实现了一个简易的多线程HTTP服务器支持GET、POST和HEAD三种HTTP请求方法能够根据浏览器指定的URL返回服务器上相应的网页文件并实现了日志记录和安全防护功能。有无参考他人代码参考了HTTP协议相关资料及Java Socket编程示例核心代码均为自主编写。参考git地址或博客地址http://blog.csdn.net/earbao/article/details/16354881http://zsxxsz.iteye.com/blog/568250http://www.cnblogs.com/zhijianliutang/archive/2012/09/23/2698860.html二、功能架构图三、个人任务简述本人主要负责HTTP服务器的核心协议处理模块包括HTTP请求的解析、HTTP响应的构建、服务器主框架的设计与实现以及日志工具类的开发。1. 完成的任务与功能序号完成功能与任务描述1HTTP请求解析模块使用BufferedInputStream实现HttpRequest类逐字节扫描\r\n\r\n标记准确解析请求行、请求头和请求体支持URL解码2HTTP响应构建模块实现HttpResponse类使用工厂模式提供6种状态码的创建方法自动添加Server、Date等标准响应头3服务器主框架设计实现HttpServer类使用ServerSocket监听端口ExecutorService线程池管理并发连接4协议处理逻辑实现HTTP/1.1协议处理支持GET、POST、HEAD三种方法使用switch-case分发请求5日志工具类实现Logger类支持INFO、ERROR、WARN三种日志级别和访问日志记录四、本人负责功能详解1. *HTTP请求解析模块简述HTTP请求解析模块负责将客户端发送的原始HTTP请求字节流解析为结构化的请求对象。采用BufferedInputStream逐字节读取检测\r\n\r\n标记头部结束避免BufferedReader缓冲区干扰POST数据读取的问题。难点与解决方法难点BufferedReader内部缓冲区会干扰POST数据读取导致请求超时解决改用BufferedInputStream ByteArrayOutputStream逐字节扫描头部结束标记publicstaticHttpRequestparse(InputStreaminputStream){BufferedInputStreambisnewBufferedInputStream(inputStream);ByteArrayOutputStreamheaderBuffernewByteArrayOutputStream();intprev0,curr;booleanheaderEndfalse;while((currbis.read())!-1){headerBuffer.write(curr);if(prev\rcurr\n){byte[]bufheaderBuffer.toByteArray();intlenbuf.length;if(len4buf[len-4]\rbuf[len-3]\nbuf[len-2]\rbuf[len-1]\n){headerEndtrue;break;}}prevcurr;}// 解析请求行和请求头...}2. *HTTP响应构建模块简述HTTP响应构建模块使用工厂模式为每种HTTP状态码提供静态创建方法。支持200 OK、400 Bad Request、403 Forbidden、404 Not Found、405 Method Not Allowed、500 Internal Server Error六种状态码。难点与解决方法难点需要支持多种状态码每种有不同的响应体解决采用工厂模式每种状态码对应一个静态create方法publicstaticHttpResponsecreateOk(StringcontentType,byte[]body){HttpResponseresponsenewHttpResponse();response.statusCode200;response.statusMessageOK;response.headers.put(Content-Type,contentType);response.headers.put(Content-Length,String.valueOf(body.length));response.bodybody;returnresponse;}publicstaticHttpResponsecreateNotFound(){HttpResponseresponsenewHttpResponse();response.statusCode404;response.statusMessageNot Found;Stringbodyhtmlbodyh1404 Not Found/h1/body/html;response.headers.put(Content-Type,text/html; charsetUTF-8);response.bodybody.getBytes();returnresponse;}3. *服务器主框架设计简述服务器主框架是系统的入口和控制中心使用ServerSocket监听端口ExecutorService线程池管理并发连接支持命令行参数指定端口号。难点与解决方法难点需要支持多个客户端同时连接解决使用FixedThreadPool线程池大小为10为每个连接提交独立任务publicvoidstart(){try{serverSocketnewServerSocket(port);runningtrue;Logger.info(简易HTTP服务器启动成功);Logger.info(监听端口: port);while(running){SocketclientSocketserverSocket.accept();threadPool.submit(newClientHandler(clientSocket));}}catch(IOExceptione){Logger.error(服务器异常: e.getMessage());}}4. 日志工具类简述实现Logger日志工具类支持INFO、ERROR、WARN三种日志级别和访问日志记录所有日志带时间戳便于调试和监控。publicclassLogger{privatestaticfinalDateTimeFormatterFORMATTERDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);publicstaticvoidinfo(Stringmessage){System.out.println([LocalDateTime.now().format(FORMATTER)] [INFO] message);}publicstaticvoidaccess(StringclientIp,Stringmethod,Stringurl,intstatusCode){System.out.println([LocalDateTime.now().format(FORMATTER)] clientIp method url statusCode);}}五、课程设计感想在本次课程设计中我深入学习了HTTP协议和Java Socket网络编程遇到了不少困难也收获了很多经验。遇到的困难及解决过程POST请求超时问题最初使用BufferedReader读取HTTP请求发现curl发送的POST请求会超时。经过调试发现是BufferedReader的内部缓冲区在读取请求头时已经消费了部分POST body字节导致后续读取阻塞。最终改用BufferedInputStream逐字节读取精确控制字节位置解决了这个问题。URL编码问题浏览器发送的URL可能包含编码字符如中文需要正确解码。使用URLDecoder.decode()方法解决了这个问题。多线程资源管理在多线程环境下需要确保每个线程正确释放资源。通过使用try-finally语句和适当的异常处理解决了资源泄漏问题。收获与体会通过本次课程设计我不仅掌握了HTTP服务器的基本原理和实现方法还提高了面向对象设计能力。深刻体会到了模块化设计的重要性合理的模块划分使得代码更易于维护和扩展。同时也认识到了网络编程中细节处理的重要性一个小小的缓冲区问题就可能导致整个功能失效。六、展望1. 自己所完成功能的不足之处及改进方法协议支持有限目前仅支持GET、POST、HEAD三种方法未来可增加PUT、DELETE等方法的支持。性能优化当前线程池大小固定为10未来可根据负载动态调整或使用NIO技术提高性能。2. 课设后想要进一步做的事情学习NIO编程深入学习Java NIO技术实现更高性能的非阻塞HTTP服务器。研究HTTP/2协议了解HTTP/2协议的新特性如多路复用、头部压缩等。增加动态内容处理支持Servlet规范实现动态内容生成。