初探Tomcat源码 (3) —— SimpleHttpServer

        前面分别介绍了Http的请求响应,以及Socket的通信,现在整合起来,看请求响应怎么通过Socket来交互通信。

        我们通过下面一个简单ServerSocket的应用,来把Request和Response融入到Socket的传输通信中。

 

/**

 * 模拟简单的服务器端

 */

public class SimpleHttpServer {

    public static void main(String[] arg) {

        String SHUTDOWM = "SHUTDOWN";

        ServerSocket serverSocket = null;

        InputStream input = null;

        OutputStream output = null;

        try {

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

            while (true) {       // 循环监听,接收请求

                Socket socket =serverSocket.accept();

                input =socket.getInputStream();

                output =socket.getOutputStream();

 

                // 根据接收到的Socket流,创建请求和响应Request/ Response

                Request request = new Request(input);

                Response response = new Response(output);

               

                // 处理,并返回

                String deal = "Hello World";

               response.sendStaticResource(deal);

                socket.close();

 

                // 如果收到停止的命令,则跳出循环,关闭Server

                if (SHUTDOWM.equals(request.getURI())) {

                    break;

                }

            }

        }

        catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 各种close,此处省略

        }

    }

}


此处ServerSocket把接收到的Socket流,转换成Request对象,进行处理,并把响应流转换成Response对象。

为什么要这么做呢?这是把请求流和响应流结构化,方便后面的解析和处理,因为后面的处理(Servlet等)都是基于标准的HttpRequest和HttpResponse对象的。这也是统一化标准化的体现。

 

此处的Request和Response都只是为了体现和Socket的关系,所以非常简单。

/**

 * 模拟请求类

 */

class Request {

    public Request(InputStream in) {}

    public String getURI() {

        return null;

    }

}

/**

 * 模拟响应类

 */

class Response {

    private OutputStream out = null;

    public Response(OutputStream out) {

        this.out = out;

    }

    public void sendStaticResource(String strOut) {

        PrintWriter output = new PrintWriter(new BufferedWriter(newOutputStreamWriter(out)), true);

        output.println(strOut);

    }

}


 — — 参考《How Tomcat Works》

你可能感兴趣的:(Tomcat,源码)