当前位置: 首页 > news >正文

Tomcat简单实现

模拟http协议所以需要处理请求与封装响应

之后在服务器端就可以进行使用

创建处理请求类

package com.ai; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; public class HttpRequest { //客户端请求的uri private String allUri; //请求的服务uri private String uri; //从请求解析的数据 private HashMap<String, String> values=new HashMap<>(); public String getAllUri() { return allUri; } public void setAllUri(String allUri) { this.allUri = allUri; } public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public HashMap<String, String> getValues() { return values; } public void setValues(HashMap<String, String> values) { this.values = values; } public HttpRequest(InputStream in) throws IOException{ resolverRequest(in); } private void resolverRequest(InputStream in) throws IOException { //获取输入流中数据 InputStreamReader isr=new InputStreamReader(in); BufferedReader br=new BufferedReader(isr); //读取 客户端请求过来的数据,获取请求头解析出来uri String requestHead=br.readLine(); //包含数据在内的uri allUri=requestHead.split(" ")[1]; //请求的uri this.uri=allUri.split("\\?")[0]; //判断请求是否是静态资源不是则解析数据 if(!Server.isStatic(allUri)) { //数据字符串username=adas&password=11111 String dataStr=allUri.split("\\?")[1]; toMap(dataStr); } } //将字符串数据转换为map public void toMap(String dataStr) { String[] split = dataStr.split("&"); for (String string : split) { String[] data = string.split("="); values.put(data[0], data[1]); } } @Override public String toString() { return "HttpRequest [allUri=" + allUri + ", uri=" + uri + ", values=" + values + "]"; } }

创建响应类

package com.ai; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; public class HttpResponse { // 获取输出流用于响应 private OutputStream out = null; public HttpResponse(OutputStream out) { super(); this.out = out; } // 这个方法的作用是把请求的地址传递进来,服务器这个时候向客户端回写响应的文件数据等 public void writeFile(String path) throws IOException { // 获取当前项目路径用于返回当前项目下静态资源 String basepath = new File("").getCanonicalPath(); FileInputStream fis = new FileInputStream(basepath + "/" + path); StringBuffer sb = new StringBuffer(); // 拼凑响应头信息 sb.append("HTTP/1.1 200 OK\n"); sb.append("\r\n"); byte[] buff = new byte[1024]; int len = 0; // 响应业务, out.write(sb.toString().getBytes()); while ((len = fis.read(buff)) != -1) { out.write(buff, 0, len); } fis.close(); out.flush(); out.close(); } public void exec(HttpRequest request) throws IOException { System.out.println("请求的服务:"+request.getUri().substring(1)); System.out.println("请求的数据:"+request.getValues()); //通过预先配置将uri与处理的服务绑定 //通过url获取服务 反射执行相应方法进行服务执行 } }

使用tcp创建服务器端

package com.ai; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8888); System.out.println("启动服务器....8888端口"); //阻塞方法获取客户端对象 Socket s = ss.accept(); //创建相应的请求相应对象 HttpRequest request = new HttpRequest( s.getInputStream() ); HttpResponse response = new HttpResponse(s.getOutputStream()); //System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器"); String requesturi = request.getUri(); System.out.println(request); //如果请求静态资源直接返回 if(isStatic(requesturi)){ response.writeFile(request.getUri()); }else { response.exec(request); } s.close(); } catch (IOException e) { e.printStackTrace(); } } //一些静态资源的判断(可以在数组中进行添加) public static boolean isStatic( String uri ){ boolean isStatic = false; String []suffixs = {"html","css","js","jpg","png","gif","bmp"}; for( String suffix : suffixs){ if(uri.endsWith("."+suffix)){ isStatic = true; break; } } return isStatic; } }
http://www.jsqmd.com/news/477247/

相关文章:

  • 关于学生课堂行为识别算法
  • 微软 GraphRAG从构图到检索的核心逻辑与代码实现
  • 2026年黄铜、不锈钢、钛合金光纤接头精密零件CNC加工厂家权威推荐:这三家凭什么脱颖而出? - 余文22
  • Esri 2020 10m全球土地覆盖数据下载(Land Cover Downloader)
  • Visual Studio - 修改主题背景颜色
  • 衬线字体 (serif) 和无衬线字体 (sans-serif)
  • Flutter 三方库 google_play_scraper 鸿蒙适配指南 - 实现高性能应用商店元数据抓取、在 OpenHarmony 上打造竞品分析数据防御线实战
  • 蜂胶经常吃的品牌是选哪个? 2026年高吸收蜂胶TOP十榜单:10款实测优选! - 博客万
  • Visual Studio - 修改字体
  • 2019年年底面试了几家大型互联网公司
  • 人脸识别/戴口罩人脸识别 快速实现部署系统方案(Linux / Android)
  • scottplot5中使用signalXY图,如何更新数据?
  • Visual Studio 设置制表符大小和缩进大小
  • 自动导入 AutoImport:告别手动引入依赖,优化Vue3开发体验
  • 叶酸哪个牌子最好最有效?2026叶酸口碑榜单最新揭晓,黄余堂复配辅酶Q10全方位守护母婴安全更省心 - 博客万
  • 解决学某通中不能粘贴的问题
  • 3/14总结:第三届“东软杯”计算机创新设计大赛——基于多智能体协作的复杂数据库自然语言查询系统
  • 2026 年,企业级 AI Agent 的成熟元年
  • vue2.x中slot插槽的使用
  • 【CSS】CSS所有选择器的用法及示例(完整版)
  • FD泄漏查看
  • pycharm+pyside2+Qt Designer 关联
  • 基于LLM的电商分析系统设计
  • CAD图纸幅面
  • ubuntu 22.04 网络图标不见的问题解决方案
  • UE5.7.4源代码分析——字符类型
  • Python 基础知识
  • 基于深度学习车牌识别方案
  • PyAPS下载Climate Data Store数据
  • VM虚拟机使用的镜像文件下载