初探Tomcat源码 (3) —— SimpleHttpServer

本文介绍了一个简单的HTTP服务器实现,该服务器使用Socket通信处理客户端请求。通过将HTTP请求和响应融入Socket流,演示了如何创建Request和Response对象进行交互。

        前面分别介绍了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》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值