深入剖析Tomcat(一)

简单Web服务器原理
本文介绍了HTTP协议的基础知识,包括HTTP请求与响应的结构,并通过一个简单的Java Web服务器实例展示了如何使用Socket和ServerSocket类进行网络通信。

简单的Web服务器

本章介绍Java Web服务器是如何运行的

Warming Up

因为使用HTTP与客户(浏览器)通信
so
- Web服务器 == Http服务器
- 两个重要的类 java.net.Socket 和 java.net.ServerSocket

本章内容

  • 简介HTTP
  • 介绍一个简单的Web服务器

HTTP

HyperText Transfer Protocol 超文本传输协议

HTTP请求

  • 请求方法 URL 协议/版本
  • 请求头
  • 回车换行
  • 实体

举例如下

POST /examples/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

lastName=Franks&firstName=Michael

HTTP响应

与HTTP请求类似
- 协议 状态码 描述
- 响应头
- 回车换行CRLF
- 响应实体段

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2004 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112

<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
Welcome to Brainy Software
</body>
</html>

Socket类

套接字 java.net.Socket

网络连接的端点 –> 网络 I/O 通过Socket在网络中读、写数据 就好比电话

创建

拿起电话打给哪儿

public Socket (java.lang.String host , int port )
//打给yahoo80端口
new Socket("yahoo", 80);

听筒

java.io.InputStream    getInputStream()

话筒

//字节流
getOutputStream()
//字符流
返回的OutputStream对象创建PrintWriter对象

OutputStream os = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush);

实例

创建了一个套接字Socket,用于本地HTTP服务器通信,发送HTTP请求 接受服务器响应信息 并将其输出在console

//创建socket
Socket socket = new Socket("127.0.0.1", "8080");

//创建发送字节流
OutputStream os = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush);

//缓冲
BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputstream() ));

// send an HTTP request to the web server
out.println("GET /index.jsp HTTP/1.1");
out.println("Host: localhost:8080");
out.println("Connection: Close");
out.println();

// read the response
boolean loop = true;
StringBuffer sb = new StringBuffer(8096);
while (loop) {
    if ( in.ready() ) {
        int i=0;
        while (i!=-1) {
            i = in.read();
            sb.append((char) i);
        }
        loop = false;
    }
    Thread.currentThread().sleep(50);
}

// display the response to the out console
System.out.println(sb.toString());
socket.close();

ServerSocket类 客户端套接字

即客户要连接到远程服务器应用程序时创建的套接字

serverSocket与Socket不同
SeverSocket要等客户端的连接请求
服务器接收到请求 创建一个Socket实例来处理与客户的通信

构造

ServerSocket(int port, int backlog, InetAddress bindAddr)  //listen backlog?
//表示在服务器拒绝接收传入的请求之前,传入连接请求的最大队列长度

其中静态绑定地址必须是java.net.InetAddress
创建方法可以是 InetAddress.getByName("127.0.0.1");

new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));

创建后等待传入连接请求,连接请求通过服务器套接字 侦听的端口绑定传入
这些工作通过ServerSocket类的accept方法完成
此方法为阻塞方法

APPLICATION

实现
- 入口点main方法在httpServer中
- 创建HttpServer对象
- 调用await方法
- 创建客户端套接字ServerSocket
- 阻塞方法accept
- Request 读入解析
- Response 发送静态资源

《深入剖析Tomcat(中文版+英文版)》.rar 《深入剖析Tomcat》深入剖析Tomcat 4和Tomcat 5中的每个组件(如果TOMCAT版本有点老,不过现在的Tomcat6和7同样可以借鉴参考),并揭示其内部工作原理。通过学习《深入剖析Tomcat》,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器。作为个开源和小型的轻量级应用服务器Tomcat 易于使用,便于部署,但Tomcat本身是个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。《深入剖析Tomcat》从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。 目录 第1章 个简单的web服务器 1.1 http 1.1.1 http请求 1.1.2 http响应 1.2 socket类 1.3 应用程序 1.3.1 httpserver类 1.3.2 request类 1.3.3 response类 1.3.4 运行应用程序 1.4 小结 第2章 个简单的servlet容器 2.1 javax.servlet.servlet接口 2.2 应用程序 2.2.1 httpserver1类 2.2.2 request类 2.2.3 response类 2.2.4 staticresourceprocessor类 2.2.5 servletprocessor1类 2.2.6 运行应用程序 2.3 应用程序 2.4 小结 第3章 连接器 3.1 stringmanager类 3.2 应用程序 3.2.1 启动应用程序 3.2.2 httpconnector类 3.2.3 创建httprequest对象 3.2.4 创建httpresponse对象 3.2.5 静态资源处理器和servlet处理器 3.2.6 运行应用程序 3.3 小结 第4章 tomcat的默认连接器 4.1 http 1.1的新特性 4.1.1 持久连接 4.1.2 块编码 4.1.3 状态码100的使用 4.2 connector接口 4.3 httpconnector类 4.3.1 创建服务器套接字 4.3.2 维护httpprocessor实例 4.3.3 提供http请求服务 4.4 httpprocessor类 4.5 request对象 4.6 response对象 4.7 处理请求 4.7.1 解析连接 4.7.2 解析请求 4.7.3 解析请求头 4.8 简单的container应用程序 4.9 小结 第5章 servlet容器 5.1 container接口 5.2 管道任务 5.2.1 pipeline接口 5.2.2 valve接口 5.2.3 valvecontext接口 5.2.4 contained接口 5.3 wrapper接口 5.4 context接口 5.5 wrapper应用程序 5.5.1 ex05.pyrmont.core.simpleloader类 5.5.2 ex05.pyrmont.core.simplepipeline类 5.5.3 ex05.pyrmont.core.simplewrapper类 5.5.4 ex05.pyrmont.core.simplewrappervalve类 5.5.5 ex05.pyrmont.valves.clientiploggervalve类 5.5.6 ex05.pyrmont.valves.headerloggervalve类 5.5.7 ex05.pyrmont.startup.bootstrap1 5.5.8 运行应用程序 5.6 context应用程序 5.6.1 ex05.pyrmont.core.simplecontextvalve类 5.6.2 ex05.pyrmont.core.simplecontextmapper类 5.6.3 ex05.pyrmont.core.simplecontext类 5.6.4 ex05.pyrmont.startup.bootstrap 5.6.5 运行应用程序 5.7 小结 第6章 生命周期 第7章 日志记录器 第8章 载入器 第9章 session管理 第10章 安全性 第11章 standardwrapper 第12章 standardcontext类 第13章 host和engine 第14章 服务器组件和服务组件 第15章 digester库 第16章 关闭钩子 第17章 启动tomcat18章 部署器 第19章 manager应用程序的servlet类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值