——每天寥寥的几笔,坚持下去,那将是一份沉甸甸的积累。
今天的笔记是针对《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();
}
接下来,不出意外,每天还会更新两章的个人总结。让知识涌入我的怀抱吧。大家共勉。