tomcat源码分析学习笔记(一)

——每天寥寥的几笔,坚持下去,那将是一份沉甸甸的积累。


今天的笔记是针对《How Tomcat Works》前两章的一些个人总结。


1.理解客户端套接字Socket类的概念。套接字是网络连接的一个端点,套接字使得一个应用可以从网络中读取和写入数据,即两台不同的计算机可以通过套接字实现字节流数据的接收和发送。

public Socket(String host, int port)//一个构造函数
Socket socket = new Socket("baidu.com",80)

2.理解服务端套接字ServerSocket类的概念。serverSocket用于服务端时刻监听请求,当有请求发送到服务端时,severSocket对象会调用accept方法获取得到那个来自客户端的Socket。

public ServerSocket(int port, int backLog, InetAddress bindingAddr)//backLog最大连接请求队列长度
ServerSocket serverSocket = new serverSocket(8080, 1,InetAddress.getByName("127.0.0.1"))
Socket socket = serverSocket.accept();

3.具体的简要流程

客户端通过HTTP发送请求

->服务器接收请求,并用serverSocket创建和获得客户端套接字socket

->用得到的套接字调用方法获得输入输出字节流对象input,output

->用两个字节流分别构造request和response对象

->request解析input里面的内容,解析出客户端具体访问的资源名称和位置

->根据资源位置和名称判定是直接访问资源还是交予相应的servlet的service方法处理

->servlet处理完,将结果写到response中


public ServerSocket(int port, int backLog, InetAddress bindingAddr)//backLog最大连接请求队列长度
ServerSocket serverSocket = new serverSocket(8080, 1,InetAddress.getByName("127.0.0.1"))
Inputstream input = null;
Outputstream output = null;
while(true){
	Socket socket = null;
	socket = serverSocket.accept();
	input = socket.getInputStream();
	output = socket.getOutputStream();
	Request request = new Request(input);
	request.parse();//request解析HTTP报文头,得到资源的Uri
	Response response = new Response(output);
	response.setRequest(request);
	//根据request的解析结果分发到不同的类(servlet)去处理
	if(request.getUri().equals("XXXServlet")){
		//通过反射机制调用相关servlet的service方法处理,结果写到response中
		Class.forName("XXX").newInstance().service(request,response);
	}else if(){
		//或者直接调用什么静态资源(可以不用servlet处理)
	}
	....
}


4.观察servlet接口的源码

public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}


由上可知,service方法的参数request,response分别是servletRequest,servletResponse类型的,因此,我们上面的简化程序中的request和response类也应该实现这两个接口。


其中ServletRequest接口也奉上吧

public interface ServletRequest {
    public Object getAttribute(String name);
    public Enumeration getAttributeNames();
    public String getCharacterEncoding();
    public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;
    public int getContentLength();
    public String getContentType();
    public ServletInputStream getInputStream() throws IOException; 
    public String getParameter(String name);
    public Enumeration getParameterNames();
    public String[] getParameterValues(String name);
    public Map getParameterMap();
    public String getProtocol();
    public String getScheme();
    public String getServerName();
    public int getServerPort();
    public BufferedReader getReader() throws IOException;
    public String getRemoteAddr();
    public String getRemoteHost();
    public void setAttribute(String name, Object o);
    public void removeAttribute(String name);
    public Locale getLocale();
    public Enumeration getLocales();
    public boolean isSecure();
    public RequestDispatcher getRequestDispatcher(String path);
    public String getRealPath(String path);
    public int getRemotePort();
    public String getLocalName();
    public String getLocalAddr();
    public int getLocalPort();
}

接下来,不出意外,每天还会更新两章的个人总结。让知识涌入我的怀抱吧。大家共勉。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值