你的位置:首页 > 软件开发 > Java > 理解tomcat之搭建简易http服务器

理解tomcat之搭建简易http服务器

发布时间:2016-06-01 16:00:05
做过java web的同学都对tomcat非常熟悉。我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http服务器,本篇文章将搭建一个简单的http服务器。1 Catalina模型   首先我们先了解一下tomcat的大致工作原理 ...

   做过java web的同学都对tomcat非常熟悉。我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http服务器,本篇文章将搭建一个简单的http服务器。

1 Catalina模型

   首先我们先了解一下tomcat的大致工作原理。tomcat的核心是servlet容器,我们称它为Catalina(为什么叫这个名字?我也不知道 ̄へ ̄)。模型图如1.1

     理解tomcat之搭建简易http服务器

                                        图1.1

    Connector是用来“连接”容器里边的请求的。它的工作是为接收 到每一个 HTTP 请求构造一个 request 和 response 对象。然后它把流程传递给容器。容器从连接 器接收到 requset 和 response 对象之后调用 servlet 的 service 方法用于响应。谨记,这个描 述仅仅是冰山一角而已。这里容器做了相当多事情。例如,在它调用 servlet 的 service 方法之 前,它必须加载这个 servlet,验证用户(假如需要的话),更新用户会话等等。 以此为思路,我们就开始我们的构造http服务器之旅吧。

2 服务器搭建

  首先我们明确一下我们的服务器的功能点。

  1. 需要有一个类去接收http请求;

  2. 需要一个自定义Request类和Response类,把接收到的请求构造成这两个类;

  3. 根据请求的格式来确定处理方式:返回静态资源 or 进入Servlet ?

  4. 需要一个Servlet类执行业务逻辑

  UML图如下2.1

  理解tomcat之搭建简易http服务器  

                                     图2.1

2.1 HttpServer 

首先构造HttpServer类

理解tomcat之搭建简易http服务器理解tomcat之搭建简易http服务器
 1 public class HttpServer { 2  3  4   private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; 5   private static boolean shutdown = false; 6  7   public static void main(String[] args) { 8     HttpServer server = new HttpServer(); 9     server.await();10   }11 12   public static void await() {13     ServerSocket serverSocket = null;14     int port = 8080;15     try {16       serverSocket = new ServerSocket(port, 1,17           InetAddress.getByName("127.0.0.1"));18     } catch (IOException e) {19       e.printStackTrace();20       System.exit(1);21     }22     // Loop waiting for a request23     while (!shutdown) {24       Socket socket = null;25       InputStream input = null;26       OutputStream output = null;27       try {28         socket = serverSocket.accept();29         input = socket.getInputStream();30         output = socket.getOutputStream();31         // create Request object and parse32         Request request = new Request(input);33         request.parseUrl();34         // create Response object35         Response response = new Response(output);36         response.setRequest(request);37 38         if (request.getUri().startsWith("/v2/")) {39           ServletProcessor processor = new ServletProcessor();40           processor.process(request, response);41         }42         else {43           StaticResourceProcessor processor =44               new StaticResourceProcessor();45           processor.process(request, response);46         }47         // Close the socket48         socket.close();49         //check if the previous URI is a shutdown command50         shutdown = request.getUri().equals(SHUTDOWN_COMMAND);51       } catch (Exception e) {52         e.printStackTrace();53         System.exit(1);54       }55     }56   }57 }

2.2 Request Response

     servlet 的 service 方法从 servlet 容器中接收一个 javax.servlet.ServletRequest 实例 和一个 javax.servlet.ServletResponse 实例。这就是说对于每一个 HTTP 请求,servlet 容器 必须构造一个 ServletRequest 对象和一个 ServletResponse 对象并把它们传递给正在服务的 servlet 的 service 方法。 

 

理解tomcat之搭建简易http服务器理解tomcat之搭建简易http服务器
 1 public class Request implements ServletRequest { 2  3   private InputStream input; 4   private String uri; 5  6   public Request(InputStream input) { 7     this.input = input; 8   } 9  10   public String getUri(){ 11     return uri; 12   } 13  14   public void parseUrl() { 15     StringBuffer request = new StringBuffer(2048); 16     int i; 17     byte[] buffer = new byte[2048]; 18  19     try { 20       i = input.read(buffer); 21     } catch (IOException e) { 22       e.printStackTrace(); 23       i = -1; 24     } 25  26     for (int j = 0; j < i; j++) { 27       request.append((char) buffer[j]); 28     } 29  30     System.out.print(request.toString()); 31     uri = parseUri(request.toString()); 32   } 33  34   private static String parseUri(String requestString) { 35     int index1, index2; 36     index1 = requestString.indexOf(' '); 37     if (index1 != -1) { 38       index2 = requestString.indexOf(' ', index1 + 1); 39       if (index2 > index1) 40         return requestString.substring(index1 + 1, index2); 41     } 42     return null; 43   } 44  45   @Override 46   public Object getAttribute(String name) { 47     return null; 48   } 49  50   @Override 51   public Enumeration getAttributeNames() { 52     return null; 53   } 54  55   @Override 56   public String getCharacterEncoding() { 57     return null; 58   } 59  60   @Override 61   public void setCharacterEncoding(String env) throws UnsupportedEncodingException { 62  63   } 64  65   @Override 66   public int getContentLength() { 67     return 0; 68   } 69  70   @Override 71   public String getContentType() { 72     return null; 73   } 74  75   @Override 76   public ServletInputStream getInputStream() throws IOException { 77     return null; 78   } 79  80   @Override 81   public String getParameter(String name) { 82     return null; 83   } 84  85   @Override 86   public Enumeration getParameterNames() { 87     return null; 88   } 89  90   @Override 91   public String[] getParameterValues(String name) { 92     return new String[0]; 93   } 94  95   @Override 96   public Map getParameterMap() { 97     return null; 98   } 99 100   @Override101   public String getProtocol() {102     return null;103   }104 105   @Override106   public String getScheme() {107     return null;108   }109 110   @Override111   public String getServerName() {112     return null;113   }114 115   @Override116   public int getServerPort() {117     return 0;118   }119 120   @Override121   public BufferedReader getReader() throws IOException {122     return null;123   }124 125   @Override126   public String getRemoteAddr() {127     return null;128   }129 130   @Override131   public String getRemoteHost() {132     return null;133   }134 135   @Override136   public void setAttribute(String name, Object o) {137 138   }139 140   @Override141   public void removeAttribute(String name) {142 143   }144 145   @Override146   public Locale getLocale() {147     return null;148   }149 150   @Override151   public Enumeration getLocales() {152     return null;153   }154 155   @Override156   public boolean isSecure() {157     return false;158   }159 160   @Override161   public RequestDispatcher getRequestDispatcher(String path) {162     return null;163   }164 165   @Override166   public String getRealPath(String path) {167     return null;168   }169 170   @Override171   public int getRemotePort() {172     return 0;173   }174 175   @Override176   public String getLocalName() {177     return null;178   }179 180   @Override181   public String getLocalAddr() {182     return null;183   }184 185   @Override186   public int getLocalPort() {187     return 0;188   }189 }

原标题:理解tomcat之搭建简易http服务器

关键词:tomcat

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录