How Tomcat Works学习笔记<一>

 

1 第一章、 一个简单的web服务器

这一章主要介绍一个web服务器是怎样工作的,一个web服务器通常也叫Http服务器因为通过http协议与客户端(浏览器)交互。

1.1     超文本传输协议HTTP

HTTP协议包括HTTP Request和HTTP Response

Client初始化连接的时候为传送一个HTTP Request,包括三个部分:

         方法-URI-协议/版本

         Request 头

         Request 体

与Request HTTP相似,HTTP Response也包括三个部分:

         协议-状态-描述

         Response 头

         Response 体

1.2     Socket 和 ServerSocket

套接字socket代表客户端与服务器连接,你可以通过他与服务器建立连接,可以指定host和port,Java中用Socket类来建立,有多个构造函数。

可以通过ServerSocket建立http服务器或者ftp服务器。

 

1.3     应用

在eclipse中建立java工程tomcat_study,具体结构如下:

         src:存放java原文件

         webroot: 存放html文件

         lib:所需库

         webapps:应用程序

        

这里实现一个服务器应用,主要实现三个类:

         HttpServer

         Request

         Response

在main方法中创建HttpServer实例,并调用它的await方法,该方法监听制定端口的Http请求,处理以后返回给客户端,直到收到shutdown命令。

 

package com.ex01.pyfrmont;

 

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

 

/**

 *

 * 服务器实现类,await方法,该方法监听制定端口的Http请求,

 * 处理以后返回给客户端,直到收到shutdown命令

 * @author peng_yf

 * @version 1.0,2011-08-20

 * @since 1.0

 *

 */

public class HttpServer {

 

    /**

     * WEB_ROOT is the directory where our HTML and other files reside.

     * For this packge,WEB_ROOT is the "webroot" directory under the

     * working directory.

     * The working directory is the location in the file system from

     * where the java command was invoked.

     */

    public static final String WEB_ROOT =

       System.getProperty("user.dir") + File.separator + "webroot";

   

    /**

     * shutdown command

     */

    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

   

    /**

     * the shutdown command received

     */

    private boolean  shutdown = false;

   

    /**

     * @param args

     */

    public static void main(String[] args) {

       HttpServer server = new HttpServer();

       server.await();

    }

 

    private void await() {

       ServerSocket serverSocket = null;

       int port = 8080;

       try{

           serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));

       }catch (IOException e) {

           e.printStackTrace();

           System.exit(1);

       }

      

       //Loop waiting for a request

        while(!shutdown){

           Socket socket = null;

           InputStream input = null;

           OutputStream output = null;

          

           try{

              socket = serverSocket.accept();

              input = socket.getInputStream();

              output = socket.getOutputStream();

             

              //create Request object and parse

              Request request = new Request(input);

              request.parse();

             

              //create Response object

              Response response = new Response(output);

              response.setRequest(request);

              response.sendStaticResource();

             

              //close the socket

               socket.close();

             

              //check if the previous URI is a shutdown command

              shutdown = request.getUri().equals(SHUTDOWN_COMMAND);

           }catch (Exception e) {

              e.printStackTrace();

              continue;

           }  

       }      

    }

}

 

         Request代表一个HTTP请求,用Socket中与客户端通信的输入流来构造,可以通过其中的read方法读取HTTP格式数据。

package com.ex01.pyfrmont;

 

import java.io.IOException;

import java.io.InputStream;

 

/**

 * 代表一个HTTP请求,用Socket中与客户端通信的输入流来构造,可

 * 以通过其中的read方法读取HTTP格式数据

 * @author Peng_yf

 * @version 1.0,2011-08-20

 * @since 1.0

 */

public class Request {

 

    private InputStream input;

    private String uri;

   

    public Request(InputStream input) {

       this.input = input;

    }

   

    public void parse() {

       // Read a set of characters from the socket

       StringBuffer request = new StringBuffer(2048);

       int i;

       byte[] buffer = new byte[2048];

       try {

           i = input.read(buffer);

       } catch (IOException e) {

           e.printStackTrace();

           i = -1;

       }

       for(int j=0; j < i; j++){

           request.append((char)buffer[j]);

       }

       System.out.println(request.toString());

        uri = parseUri(request.toString());

    }

 

    private String parseUri(String requestString){

       int index1,index2;

       index1 = requestString.indexOf(' ');

       while(index1 != -1){

           index2 = requestString.indexOf(' ', index1+1);

           if(index1 < index2){

              return requestString.substring(index1+1,index2);

           }

       }

       return null;

    }

   

    public String getUri(){

       return this.uri;

    }

   

}

 

                   Response代表HTTP响应。

package com.ex01.pyfrmont;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.OutputStream;

 

/**

 * HTTP Response = Status-Line

 * *((general-header|response-header|entity-header)CRLF)

 * CRLF

 * [message body]

 * Status-Line=HTTP-Version SP Status-Code SP Response-Phrase CRLF

 * @author Peng_yf

 * @version 1.0, 2011-08-20

 * @since 1.0

 *

 */

public class Response {

    private static final int BUFFER_SIZE = 1024;

    OutputStream output;

    Request request;

   

    public Response(OutputStream output) {

       this.output = output;

    }

 

    public void setRequest(Request request) {

       this.request = request;

    }

 

    public void sendStaticResource() {

       byte[] bytes = new byte[BUFFER_SIZE];

       FileInputStream fis = null;

       try {

           File file = new File(HttpServer.WEB_ROOT,request.getUri());

           if(file.exists()){

              fis = new FileInputStream(file);

              int ch = fis.read(bytes,0,BUFFER_SIZE);

              if(ch != -1){

                  output.write(bytes, 0, ch);

                  ch = fis.read(bytes,0,BUFFER_SIZE);

              }

           }else{

              //file not found

              String errorMessage = "HTTP/1.1 404 File Not Found¥r¥n" +

                  "Content-Type:text/html¥r¥n" +

                  "Content-Length:23¥r¥n"+

                  "¥r¥n" +

                  "<h1> File Not Found</h1>";

              output.write(errorMessage.getBytes());   

           }

       } catch (Exception e) {

           //thrown if cannot instantiate a File object.

           System.out.println(e.getMessage());

           e.printStackTrace();

       }finally{

           if(fis != null){

              try {

                  fis.close();

              } catch (IOException e) {

                  e.printStackTrace();

              }

           }

       }

    }

}

测试运行时,运行HttpServer,在界面输入:

         http://localhost:8080/index.html

将会在浏览器中显示index.html中的内容。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值