手写Tomcat之-ClientHandler(2)

这个博客讲述了如何在Java中实现一个Web服务器的客户端处理器。它解析HttpRequest,根据请求路径查找并执行相应的Servlet,或者从webapps目录下查找并响应静态资源。如果资源不存在,则返回404错误页面。最后,处理器会关闭客户端连接,释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.webserver.core;
import java.io.File;
import java.net.Socket;
import com.webserver.http.EmptyRequestException;
import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;
import com.webserver.servlet.HttpServlet;

用于处理客户端请求

public class ClientHandler implements Runnable{
	private Socket socket;
	public ClientHandler(Socket socket) {
		this.socket=socket;
	}
	
	public void run() {
		try {
			//1 解析请求
			//实例化请求对象,实例化过程也是解析请求的过程
			HttpRequest request=new HttpRequest(socket);
			//实例化对象
			HttpResponse response=new HttpResponse(socket);
			
			//2 处理请求
			//先通过reques获取用户请求的资源的抽象路径
			String path=request.getRequestURI();
			/*
			 * 首先判断该路径是否为请求一个业务
			 * 根据请求路径去ServerContext提供对应的Servlet
			 * 若返回不是null,则说明该请求是请求1一个业务
			 * 那么就调用对应Servlet的service方法。
			 */
			HttpServlet servlet=ServerContext.getServlet(path);
			
			if(servlet!=null) {
				servlet.service(request, response);
			}else {
				//从webapps目录下根据该抽象路径寻找请求资源 
				File file=new File("./webapps/"+path);
				//判断用户请求的资源是否存在
				if(file.exists()) {
					System.out.println("该资源已找到!");
					//将要响应的资源设置到response中
					response.setEntity(file);
					
				}else {
					System.out.println("该资源不存在!");
					//响应404页面
					response.setEntity(new File("./webapps/root/404.html"));
					
					//设置状态代码与描述
					response.setStatusCode(404);
					response.setStatusReason("NOT FOUND");
				}
			}
		
			//3 发送响应
			//响应客户端
			response.flush();
			
		} catch(EmptyRequestException e) {
			System.out.println("空请求.");
		}catch (Exception e) { 
			e.printStackTrace();
		}finally {
			try {
				//处理完毕后与客户端断开释放资源
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值