——每天寥寥的幾筆,堅持下去,那將是一份沉甸甸的積累。
今天的筆記是針對《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();
}
接下來,不出意外,每天還會更新兩章的個人總結。讓知識湧入我的懷抱吧。大家共勉。