您的位置:首页 > 其它

自己动手写Web容器之TomJetty之一:服务内功经脉

2013-06-09 23:01 267 查看
传送门 ☞ 轮子的专栏转载请注明http://blog.csdn.net/leverage_1229

Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。Tomcat 是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Jetty和Tomcat都是业内很优秀的web应用服务器。作为一名Java应用工程师,相信都会邀请它们加入到自己的项目中去。尤其是Tomcat,在国外网站的普及率在7成以上,很多应用服务器的设计思路和基层架构都源自于它。正是凭借着其小身板、免费、兼容性好的特性,赢得了绝大多数企业的倾爱,成为他们心中web应用服务器的首选。但是兼容性越好的东东,往往在某些特性方面就表现不够。例如,当服务器内存容量有限,又需要兼顾高并发性能,不少企业在选择web应用服务器上,多半会倾向于其他web容器,Jetty就是其中之一。

最近由于项目需要写Android后台服务器程序,用到了Servlet技术。笔者以前也是做Java EE的,这块儿的很多东西都忘得差不多了-_-!。这两天在整理以前的技术资料时,无意间发现一本好书《HowTomcatWorks》。在参考借鉴的同时,决定自己弄个野生的web容器玩玩。毕竟黑盒“巧克力"吃多了也想换换口味儿嘛。

1网页中的“动”与“静”

现今的网页技术日新月异,记得06年在学校上网经常看到网址的后缀名都是“3P”(.asp、jsp、php),而最近的两三年已经很难再看到以这种后缀结尾的网址了,基本都是.html。有人要问这是为什么呢?主要是现在的网站构架基本都是CMS模式的。当内容基本不变或刚刚浏览过的网页采用静态技术生成,而像发帖、查找这种经常变化的网页运用动态技术生成html,当静态网页的内容需要变化时,动态网页可以帮它生成。自从引入CMS模式之后,浏览网页的速度大大加快了,网页既保持静态Html优势又兼顾动态效果。淘宝、微博、人人的网站都是这么干的^_^。

2Web应用服务器(Web容器)

对于Java而言,Web应用服务器主要是用来执行Servlet的,所以也称为Servlet容器。Servlet技术支持在服务器端编写Java程序并逻辑生成Html文件,非常切合动态网页技术的需要。但是它需要在Web容器才能运行。Web容器也是基于HTTP协议的服务器,因为它是使用HTTP协议与客户端进行通信的。一个基于java的web服务器使用两个重要的类:java.net.Socket和java.net.ServerSocket,并通过HTTP消息进行通信。

3超文本传输协议(HTTP)

HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送和接受数据。它是一种请求和响应协议。客户端请求一个文件而服务器响应请求。HTTP使用可靠的TCP连接--TCP默认使用80端口。第一个HTTP版是HTTP/0.9,然后被HTTP/1.0所替代。正在取代HTTP/1.0的是当前版本HTTP/1.1,它定义于征求意见文档(RFC) 2616,可以从http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf下载。在HTTP中,始终都是客户端通过建立连接和发送一个HTTP请求从而开启一个事务。web服务器不需要联系客户端或者对客户端做一个回调连接。无论是客户端或者服务器都可以提前终止连接。举例来说,当你正在使用一个web浏览器的时候,可以通过点击浏览器上的停止按钮来停止一个文件的下载进程,从而有效的关闭与web服务器的HTTP连接。

4HTTP请求

一个HTTP请求包括三个组成部分:

4.1方法&统一资源标识符(URI)&协议/版本,三者用英文" "分隔

POST /examples/default.jsp HTTP/1.1

4.2请求的头部,均以名-值对的方式显示,每个参数可用英文"/n"分隔

Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/QVOD, application/QVOD, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; KB974488)
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:8080
Connection: Keep-Alive

4.3请求主体内容,发送给服务器的信息

<html>
<head>
<title>HTTP Re Example</title>
</head>
<body>
Hello!
</body>
</html>

5HTTP响应

类似于HTTP请求,一个HTTP响应也包括三个组成部分:

5.1协议/版本&结果码&结果,三者用英文" "分隔

HTTP/1.1 200 OK

5.2响应的头部,均以名-值对的方式显示,每个参数可用英文"/n"分隔

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

5.3响应主体内容,响应给客户端的信息

<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
I'm Ok!
</body>
</html>

6Socket类

套接字是网络连接的一个端点。套接字使得一个应用可以从网络中读取和写入数据。放在两个不同计算机上的两个应用可以通过连接发送和接受字节流。为了从你的应用发送一条信息到另一个应用,你需要知道另一个应用的IP地址和套接字端口。在Java里边,套接字指的是java.net.Socket类。

要创建一个套接字,你可以使用Socket类众多构造方法中的一个。其中一个接收主机名称和端口号:

public Socket (java.lang.String host, int port)
在这里主机是指远程机器名称或者IP地址,端口是指远程应用的端口号。例如,要连接CSDN的9527端口,你需要构造以下的Socket对象:

new Socket ("www.csdn.net", 9527);
一旦你成功创建了一个Socket类的实例,你可以使用它来发送和接受字节流。要发送字节流,你首先必须调用Socket类的getOutputStream方法来获取一个java.io.OutputStream对象。要发送文本到一个远程应用,你经常要从返回的OutputStream对象中构造一个java.io.PrintWriter对象。要从连接的另一端接受字节流,你可以调用Socket类的getInputStream方法用来返回一个java.io.InputStream对象。

7ServerSocket类

Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个HTTP服务器或者FTP服务器,你需要一种不同的做法。这是因为你的服务器必须随时待命,因为它不知道一个客户端应用什么时候会尝试去连接它。为了让你的应用能随时待命,你需要使用java.net.ServerSocket类。这是服务器套接字的实现。ServerSocket和Socket不同,服务器套接字的角色是等待来自客户端的连接请求。一旦服务器套接字获得一个连接请求,它创建一个Socket实例来与客户端进行通信。

要创建一个服务器套接字,你需要使用ServerSocket类提供的四个构造方法中的一个。你需要指定IP地址和服务器套接字将要进行监听的端口号。通常,IP地址将会是127.0.0.1,也就是说,服务器套接字将会监听本地机器。

public ServerSocket(int port);
一旦你有一个ServerSocket实例,你可以让它在服务器套接字正在监听的端口上等待传入的连接请求。你可以通过调用ServerSocket类的accept方法做到这点。这个方法只会在有连接请求时才会返回,并且返回值是一个Socket类的实例。Socket对象接下去可以发送字节流并从客户端应用中接受字节流。
Socket socket = server.accept();

本节我们对实现一个野生Web服务器做了一些相关的知识储备与回顾,从下节开始,我们将正式踏上野生Web容器之旅,第一站将是解析HTTP请求头。敬请期待^~^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: