http客户端通过socket类与服务器通信,new Socket("yahoo.com",80);
服务器通过ServerSocket套接字创建时绑定的地址和端口等待客户端请求,new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1")),
当接收到请求后,accept函数才会返回。
//服务端 ServerSocket serverSocket = new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1")); Socket socket = serverSocket.accept(); InputStream input = socket.getInputStream(); OutputStream input = socket.getOutputStream();
Request类
用来表示一个http请求
Request request = new Request(input);
Response
用来表示http响应
Response response = newResponse(output);
Servlet 容器
javax.servlet.Servlet接口声明5个方法
init //初始化一次
service //客户端请求到达后调用,可多次调用,将javax.servlet.ServerRequest和javax.servlet.ServerResponse作为参数传入。
destory
getservletConfig
getServletInfo
public class HttpServer{ public static void main(String[] arg){ while(!loop){ //...省略 ServerSocket serverSocket = new(...) Socket socket = setverSocket.accept(); InputStream input = socket.getInputStream(); OutputStream output = socket.getOutputStream(); Request request = new Request(input); Response response = new Response(output); ServletProcessor servletProcessor = new ServletProcessor(); servletProcessor.process(request, Response); } } } //servlet类 public class clientServlet implements Servlet{ //init() //destory() //getServletInfo() //getServletConfig() public void service(ServletRequest request, ServletResponse response){ //处理 } } //Request类 public class Request implement ServletRequest{ } //Response类 public class Response implement ServletResponse{ } //ServletProcessor类 public class ServletProcessor{ public void process(Request request, Response response){ URL[] urls = new URL(1); //...url 处理 String servletName = null; //...servletName处理 URLClassLoader loader = new URLClassLoader(urls); Class class = loader.loadClass(servletName); Servlet servlet = class.newInstance(); servlet.service((ServletRequest)request, (ServletResponse)response); } }
连接器
和httpserver类似,过程如下:
public final class Bootstrap{ public static void main(String[] args){ HttpConnector httpConnector = new HttpConnector(); httpConnector.start(); } } public class HttpConnector implements Runnable{ public void run(){ while(!loop){ //...省略 ServerSocket serverSocket = new(...) Socket socket = setverSocket.accept(); HttpProcessor httpProcessor = new HttpProcessor(this); httpProcessor.process(socket); } } public void start(){ Thread thread = new Thread(this); thread.strart(); } } //HTTPProcessor类 public class HttpProcessor{ public void process(Socket socket){ SocketInputStream input = new(SocketInputStream(socket.getInputStream(), 2048); OutputStream output = socket.getOutputStream(); HttpRequest request = new HttpRequest(input); HttpResponse response = new HttpResponse(output); response.setRequest(request); parseRequest(input, output); //处理请求 parseHeaders(input); //解析头部 socket.close(); ServletProcessor servletProcessor = new ServletProcessor(); servletProcessor(request, response); } public void parseRequest(SocketInputStream input , OutputStream output){ //解析请求行 input.readRequestLine(requestLine);//读取j请求行 String method = new String(requestLine.method, 0, request.lineEnd);//获取方法 String url =. ..; String protocal = ...; String queryString = ...; //从uri中获取querystring //读取jsessionid //修正uri //解析header HttpHeader header =new HttpHeader(); input.readHeader(header); //解析cookie //获取参数 //get请求时,通过RequestUtil.parseParameters解析到HashMap //post请求时,通过header的contenttype和contentlength读取,再调用RequestUtil } } //servlet类 public class clientServlet implements Servlet{ //init() //destory() //getServletInfo() //getServletConfig() public void service(ServletRequest request, ServletResponse response){ //处理 } } //ServletProcessor类 public class ServletProcessor{ public void process(Request request, Response response){ URL[] urls = new URL(1); //...url 处理 String servletName = null; //...servletName处理 URLClassLoader loader = new URLClassLoader(urls); Class class = loader.loadClass(servletName); Servlet servlet = class.newInstance(); servlet.service((ServletRequest)request, (ServletResponse)response); } }