Tomcat|初探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);
}
}


【Tomcat|初探Tomcat源码 (3) —— SimpleHttpServer】 — — 参考《How Tomcat Works》

    推荐阅读