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();
}

接下來,不出意外,每天還會更新兩章的個人總結。讓知識湧入我的懷抱吧。大家共勉。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章