标签:
一个Servlet容器要为一个Servlet请求提供服务,基本上有三件事要做:
request对象并填充那些有可能被关联的Servlet使用的信息,如参数、头部、cookies、查询字符串、URI等等。一个request对象是 javax.servlet.ServletRequest或 javax.servlet.http.ServletRequest接口的一个实例。response对象, 关联的servlet利用该对象来给客户端发送响应。一个response对象是javax.servlet.ServletResponse或javax.servlet.http.ServletResponse接口的一个实例。servlet的service方法,并传入request和response对象。在这里servlet会从request对象取值,通过reponse来发送响应。Catalina 是一个非常复杂的,并优雅的设计开发出来的软件,同时它也是模块化的。基于“Servlet 容器是如何工作的”这一节中提到的任务,你可以把 Catalina 看成是由两个主要模块所组成的:连接器(connector)和容器(container)。
连接器是用来连接容器里面的请求的。它的工作是为接收到的每一个HTTP请求构造一个request和response对象。然后它把流程传递给容器。容器从连接器接收到request和response对象之后调用servlet的service方法用于响应。不过这个描述只不过是冰山一角而已,这里的容器做了很多事情。比如,在它调用servlet的service方法之前,它必须加载这个servlet,验证用户(假如需要的话),更新用户会话等等。一个容器为了处理这个进程使用了很多不同的模块,这也并不奇怪。例如,管理模块是用来处理用户绘画,而加载器是用来加载servlet类等等。
Web服务器也称为HTTP服务器,因为它使用HTTP来跟客户端通信,客户端通常是个web浏览器。一个基于Java的Web服务器使用两个重要的类:java.net.Socket和java.net.ServerSocket。当然现在还有基于NIO的Web服务器,使用的是java.nio.channels.SocketChannel、java.nio.channels.ServerSocketChannel和java.nio.channels.Selector。
一个HTTP请求包含三个组成部分
URI) 协议/版本 下面是一个HTTP请求的例子:
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标准里提到的多种方法中的一种。HTTP 1.1 支持7种类型的请求:GET, POST,HEAD, OPTIONS, PUT, DELETE 和 TRACE。GET 和 POST 在互联网应用里边最普遍使用的。
URI 完全指明了一个互联网资源。URI 通常是相对服务器的根目录解释的。因此,始终一斜线/开头。统一资源定位器(URL)其实是一种 URI(查看 http://www.ietf.org/rfc/rfc2396.txt)来的。
请求的头部包含了关于客户端环境和请求的主体内容的有用信息。例如它可能包括浏览器设置的语言,主体内容的长度等等。每个头部通过一个回车换行符(CRLF)来分隔的。
对于 HTTP 请求格式来说,头部和主体内容之间有一个回车换行符(CRLF)是相当重要的(加上前一个头部的CRLF,其实是2个CRLF)。 CRLF告诉HTTP服务器,主体内容是在什么地方开始的。在一些互联网编程书籍中, CRLF 还被认为是 HTTP 请求的第四部分。
Web服务器也正是根据HTTP请求的格式才能将其解析出我们想要的数据。
HTTP 响应也包括三个组成部分: 下面是一个 HTTP 响应的例子:
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>
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
虽然RFC 2616中已经推荐了描述状态的短语,例如”200 OK”,”404 Not Found”,但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
响应头部和请求头部类似,也包括很多有用的信息。响应的主体内容是响应本身的内容。头部和主体内容通过 CRLF 分隔开来。
Socket类和ServerSocket类
这两个类就Java网络编程的基础。
套接字是网络连接的一个端点,它使得一个应用可以从网络中读取和写入数据。放在两台不同计算机上的两个应用可以通过连接发送和接受字节流。为了从你的应用发送一条信息到另一个应用,你需要知道另 一个应用的IP地址和套接字端口。在Java中,套接字指的是java.net.Socket类。你可以通过和Socket关联的InputStream和OutputStream来接收和传送数据。若想发送一个HTTP请求,那么只需要遵循上面提到的HTTP协议就可以了。
ServerSocket用来建立一个服务器端,可以监听某一个端口,等待客户端的连接请求。一旦服务器套接字获得一个连接请求,它会创建一个Socket实例来与客户端通信。通常服务器套接字将会监听本地机器。服务器套接字正在监听的IP地址被称为是绑定地址。服务器套接字的另一个重要属性是backlog,当服务器的连接请求队列长度达到backlog后,服务器套接字将拒绝再进入的请求。
如何自己来实现一个简单的Web服务器
我们可以根据本文最开头说的那几个要点来实现:
ServerSocket来监听某一个端口(比如8080)等待客户端连接Request对象并通过从Socket的InputStream中读取的信息来填充Response对象,将其与Socket的OutputStream关联Servlet的service方法,并传入Request和Response对象service方法中来处理请求并把响应传回客户端。标签:
原文地址:http://blog.csdn.net/u012345283/article/details/44761341