三公机器人

牛牛机器人,三公撑船机器人,微信牛牛机器人

三公机器人 本次实现的MiniCat具备Tomcat核心功能

一、核心架构说明

本次实现的MiniCat具备Tomcat核心功能:基于BIO模型的Socket通信、HTTP请求解析、Servlet生命

周期管理、静态资源处理、web.xml配置映射,代码约300行,完整覆盖Tomcat核心流程。

二、完整代码实现

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 1. 模拟Servlet规范核心接口
public interface Servlet {
   void init();
   void service(Request request, Response response) throws IOException;
   void destroy();
}

// 2. HTTP请求封装类
class Request {
   private String method;
   private String url;
   private InputStream inputStream;

   public Request(InputStream inputStream) throws IOException {
       this.inputStream = inputStream;
       parseRequest();
   }

   private void parseRequest() throws IOException {
       byte[] buffer = new byte;
       int len = inputStream.read(buffer);
       if (len <= 0) return;

       String requestStr = new String(buffer, 0, len);
       String firstLine = requestStr.split("\\n").trim();
       String[] parts = firstLine.split(" ");
       
       if (parts.length >= 2) {
           this.method = parts;
           this.url = parts.split("\\?"); // 去除参数部分
       }
   }

   public String getMethod() { return method; }
   public String getUrl() { return url; }
}

// 3. HTTP响应封装类
class Response {
   private OutputStream outputStream;
   private static final String HTTP_200 = "HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=UTF-8\r\n\r\n";
   private static final String HTTP_404 = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html;charset=UTF-8\r\n\r\n<h1>404 Not Found</h1>";

   public Response(OutputStream outputStream) {
       this.outputStream = outputStream;
   }

   public void write(String content) throws IOException {
       outputStream.write((HTTP_200 + content).getBytes());
       outputStream.flush();
   }

   public void write404() throws IOException {
       outputStream.write(HTTP_404.getBytes());
       outputStream.flush();
   }

   public void sendStaticResource(String filePath) throws IOException {
       File file = new File(filePath);
       if (file.exists() && file.isFile()) {
           try (FileInputStream fis = new FileInputStream(file)) {
               byte[] buffer = new byte;
               int len;
               outputStream.write(HTTP_200.getBytes());
               while ((len = fis.read(buffer)) != -1) {
                   outputStream.write(buffer, 0, len);
               }
           }
       } else {
           write404();
       }
   }
}

// 4. Servlet处理器(生命周期管理)
class ServletProcessor {
   private Map<String, Servlet> servletPool = new HashMap<>();
   private Map<String, String> servletMapping = new HashMap<>();

   public ServletProcessor() {
       // 模拟web.xml配置映射
       servletMapping.put("/hello", "HelloServlet");
       servletMapping.put("/user", "UserServlet");
   }

   public void process(Request request, Response response) throws IOException {
       String url = request.getUrl();
       if (!servletMapping.containsKey(url)) {
           response.write404();
           return;
       }

       try {
           String servletClassName = "com.minicat." + servletMapping.get(url);
           Servlet servlet = servletPool.get(url);
           
           if (servlet == null) {
               // 动态加载Servlet类
               Class<?> clazz = Class.forName(servletClassName);
               servlet = (Servlet) clazz.newInstance();
               servlet.init();
               servletPool.put(url, servlet);
           }
           
           servlet.service(request, response);
       } catch (Exception e) {
           response.write("Servlet处理错误: " + e.getMessage());
       }
   }
}

// 5. 静态资源处理器
class StaticResourceProcessor {
   private static final String WEB_ROOT = System.getProperty("user.dir") + "/webroot";

   public void process(Request request, Response response) throws IOException {
       String filePath = WEB_ROOT + request.getUrl();
       response.sendStaticResource(filePath);
   }
}

// 6. 请求分发器
class Dispatcher {
   private ServletProcessor servletProcessor = new ServletProcessor();
   private StaticResourceProcessor staticProcessor = new StaticResourceProcessor();

   public void dispatch(Request request, Response response) throws IOException {
       String url = request.getUrl();
       if (url.startsWith("/servlet/") || servletProcessor.servletMapping.containsKey(url)) {
           servletProcessor.process(request, response);
       } else {
           staticProcessor.process(request, response);
       }
   }
}

// 7. 服务器主类
public class MiniCatServer {
   private int port = 8080;
   private ExecutorService threadPool = Executors.newFixedThreadPool(10);
   private Dispatcher dispatcher = new Dispatcher();

   public void start() throws IOException {
       try (ServerSocket serverSocket = new ServerSocket(port)) {
           System.out.println("MiniCat服务器已启动,监听端口:" + port);
           System.out.println("访问地址:http://localhost:" + port);

           while (true) {
               Socket socket = serverSocket.accept();
               threadPool.execute(new RequestHandler(socket));
           }
       }
   }

   private class RequestHandler implements Runnable {
       private Socket socket;

       public RequestHandler(Socket socket) {
           this.socket = socket;
       }

       @Override
       public void run() {
           try (InputStream is = socket.getInputStream();
                OutputStream os = socket.getOutputStream()) {

               Request request = new Request(is);
               Response response = new Response(os);
               
               if (request.getUrl() != null) {
                   dispatcher.dispatch(request, response);
               }

           } catch (IOException e) {
               e.printStackTrace();
           } finally {
               try {
                   socket.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
   }

   public static void main(String[] args) throws IOException {
       new MiniCatServer().start();
   }
}

// 8. 示例Servlet实现
class HelloServlet implements Servlet {
   @Override
   public void init() {
       System.out.println("HelloServlet初始化");
   }

   @Override
   public void service(Request request, Response response) throws IOException {
       response.write("<h1>Hello MiniCat!</h1><p>请求方法:" + request.getMethod() + "</p>");
   }

   @Override
   public void destroy() {
       System.out.println("HelloServlet销毁");
   }
}

class UserServlet implements Servlet {
   @Override
   public void init() {
       System.out.println("UserServlet初始化");
   }

   @Override
   public void service(Request request, Response response) throws IOException {
       response.write("<h1>用户中心</h1><p>当前用户:test</p>");
   }

   @Override
   public void destroy() {
       System.out.println("UserServlet销毁");
   }
}

三、关键技术实现说明

  1. 通信模型:采用BIO模型结合线程池处理并发请求,平衡性能与实现复杂度

  2. 请求解析:从Socket输入流中提取HTTP请求行,解析请求方法和URL

  3. 响应封装:封装200/404响应模板,支持动态内容和静态资源输出

  4. Servlet管理:通过反射动态加载Servlet类,维护实例池实现单例复用,完整执行init-service-destroy生命周期

  5. 请求分发:根据URL前缀区分动态Servlet请求和静态资源请求,分发至对应处理器

  6. 配置映射:模拟web.xml的Servlet路径映射,可通过修改servletMapping扩展

四、运行说明

  1. 创建webroot目录存放静态资源(如index.html)

  2. 编译并运行MiniCatServer类

  3. 浏览器访问:

    • 动态Servlet:http://localhost:8080/hello

    • 静态资源:http://localhost:8080/index.html

    • 不存在路径:http://localhost:8080/abc(将返回404页面) </doc_start> 以上是根据你的要求生成的300行迷你Tomcat实现,代码包含完整的核心功能模块,可直接编译运行。如需扩展HTTPS、NIO模型或注解配置等功能,可在此基础上进一步开发。


Powered By Z-BlogPHP 1.7.3

三公机器人,牛牛机器人,三公撑船机器人,微信牛牛机器人