1、 1 基于 Java的高效兼容 HTTP服务器的研究及实现 目录 摘要 1 一、引言 4 二、 HTTP 服务器模型 5 (一)超文本传输协议 5 (二) Java API中网络类包 简介 6 (三) HTTP客户机与服务器的交互涉及骤 7 (四) HHTP操作的一次事务 ( Transaction) 8 (五) HTTP消息 8 三 HTTP 服务器的兼容性 9 四 Java实现多线程 HTTP服务器设计 10 (一) Java 语言网络编程 10 (二) 服务器总体设计 12 1总体设计的关键点 12 2模块设计 12 3 HTTP 服务器各类之间关系 14 ( 三 ) 服务器详细设计分析
2、 15 1线程重用 15 2 各类和接口的主要功能 15 (四) Java 多线程机制的应用 17 五 HTTP 服务器运行 23 六结束语 24 参考文献 25 2 一引言 SUN 推出 Java 语言之后,全世界的目光都被这个神奇的语言所吸引, Java 语言从一开始就内置了支持网络编程,因此更容易编写网络应用程序;这也是与其他编程语言不同的地方。 Java 提供了大量类和接口可以处理各种网络协议,共享信息,并行计算,应用程序服务等 优秀特点使 java 技术将会得到广泛的应用。 Java 是实现定制客户机和服务器的优秀工具,因为它支持多种在网络上发送和接收数据提供服务接收数据调用服务的技
3、术。 Java 作为一种面向分布式计算机环境语言,提供了完全意义的多线程支持,利用多线程编程接口,可以方便地写出支持多线程的应用程序,这一点也是 Java 所特有的。随着 Internet 的普及和 Web 技术的迅速发展,客户 /服务器结构逐渐转向浏览器 /服务器方向,Web 文本发布具有简洁生动形象等特点,适用于发布信息,开发基于 Browser/Server 模式的 Web 数据库信息检索系统得到广泛应用。 Web服务基于超文本传输协议( HTTP 协议)。 Java 语言所具有的良好兼容性安全性健壮性及可扩展的跨平台等特性,使得 Java 成为开发基于B/S 模式的 Web 数据库应用
4、的首选计算机语言。本文使用 Java 开发一个高效兼容的 HTTP 服务器原型。( 如图一 )。 图一 HTTP 服务器原型 工作线程 工作线程 工作线程 工作线程 H T T P 服务器 多 用户 请求 3 R e q u e s t C h a in 客户端 W e b 服务器 R e s p o n s e C h a in 该多线程 HTTP 服务器使用 ServerSocket(服务器套接字)运行在服务器专用的 TCP 端口监听接收来自客户端的请求。当远程主机上的客户 Socket 试图与指定端口建立连接时,服务器被激活,根据具体情况来确定重用旧线程或生成一个新线程来响应客户端的请求
5、直到该客户退出。服务器的主线程仍然处于监听状态,等待新客户请求。 二 HTTP 服务器模型 (一)超文本传输协议 ( HTTP, Hypertext Transfer Protocol)是Web 浏览器与 Web 服务器之间通信的标准协议,是个相当详细的协议。位于 TCP/IP 协议的应用层,具有简单通用无状态灵活无连接及面向对象 等特点是互联网中最核心的协议之一。 HTTP 是 RPC 式的协议。 RPC 就是远程调用( Remote Procedure Call),是请求远程机服务和处理机制。 RPC 和编程语言中的过程调用相似,基于 C/S 和 B/S 模型,它建立在请求 /响应( Re
6、quest/Response)的基础上,服务端和客户端可能位于不同的独立系统上,客户端通过 TCP SOKET 向服务器端口(默认为 80)发送包含请求方法 URL(是对统一资源定位符( Uniform Resource Locator)用来标识 Internet 上资源的位置。 URL 类 是不能再小的最小类,它扩展 Java.lang.Object。)和协议版本信息,请求建立 Socket连接,客户的请求通过 Socket 被服务器接收,服务器对客户的请求信息参数进行分析处理,响应一个状态行,对客户的请求服务做出回应,把相应的资源文档以流形式通过 Socket 传给客户浏览器,整个过程见(
7、 图二 )所示: 4 图二 Socket 连接 (二) Java API 中网络类包 简介: Java API 中按类的形式提供了三种不同层 次的网络技术机制 ,用URL(统一资源定位符) 访问网络资源的类 ,利用 Socket(套接字 )通讯的类以及 DataGran(数据报 )类。前两种类方法更能体现 Java 作为网络语言的特点,支持 URL 类实际上也是依赖于下层支持 Socket 类方法来实现的。相对来讲, URL 是对 WEB的高层联接。 Socket 是一种底层的连接,客户机和服务器通过写入到 Socket 的字节流进行通信。 Java 系统的网络通信机制如 图二 所示,本文主要
8、讨论基于 Socket 类的通信机制。 协议组 TCP/IP 的组合 , TCP/IP 技术的核心部分是传输层 (TCP 和UDP 协议 ),网络层 (IP)协议和物理层 (面向各种物理硬件技术 ),能实现这三层协议的内核可称之为 TCP/IP网络操作系统 .TCP/IP协议技术中的中下层协议向外提供的只是原始的编程界面 ,而不是直接的用户服务 ,用户服务要靠核外的应用程序实现 .应用程序和 TCP/IP 核心协议关系如图四 所示 . (三) HTTP 客户机与服务器之间的交互涉及下列步骤: 1 HTTP应用程序1 应用程序 1 网间网编程界面 TCP/IP 核心协议 物理介质 图四 应用程序
9、和 TCP/IP 核心协议关系 Internet JAVA的网络通信机制 支持 URL的类 支持 SOCKET的类 图三 JAVA 系统的网络通信机制 5 服务器听取请求: HTTP 服务器打开听 取端口,通常是端口 80,这是在一个线程中进行的,然后线程阻止,等待入站的 HTTP 请求。 2 HTTP客户机构造 HTTP URL: HTTP 客户机需要建立与 HTTP 服务器的初始连接。为此要使用 URL,通常情况下是以 http:/www.any_ 的形式。这里 HTTP客户机指定 HTTP服务器上的缺省资源,通常是页面 index.htm或 default.htm 。缺省 Web 页面通
10、常是站点的主页。有时候 URL 会更加复杂 。 3 HTTP 客户机建立连接: HTTP 客户机建立发送套接,连接 Web服务器。发送套接让客户机向服务器提交 HTTP 请求。 4 HTTP 服务器接受连接: HTTP 服务器生成接受套接,从 HTTP 客户机接受请求。通常,接受套接在另一线程中运行,提高 Web 服务器的性能。 5 HTTP 客户机构造一个 HTTP 请求,发送到 HTTP 服务器:建立与 HTTP 服务器的连接之后,客户机构造 HTTP 请求并通过套接将其传递到 HTTP 服务器。 6HTTP 服务器处理请求: HTTP 服务器继续听取接受套接中的入站请求。得到请求时,服务
11、器分析入站请求, 并采取请求要求的操作。 7 HTTP服务器将 HTTP 响应发送给 HTTP 客户机: HTTP 服务器构造 HTTP响应,有六个部分 ( 1)、 HTTP 版本;( 2)、 HTTP 状态码;( 3)、 HTTP 状态描述(可选);( 4)、响应头字段(可选);( 5)、响应体(可选);( 6)、内容长度(可选)。服务器通过与 HTTP 客户机的连接返回响应。 8 HTTP客户机处理响应: HTTP 客户机收到服务器的响应时,客户机分析响应,然后处理响应。 9关闭套接连接: HTTP 客户机或服务器关闭连接。 (四)一次 HHTP 操作称为一次事务( Transaction
12、)。 HTTP 定义的事务处理由以下四步组成: 1 客户与 Web 服务器建立连接,打开一个称为 socket(套接字 )的虚拟文件,此文件的建立标志着连接成功。 2 客户通过 socket 向 Web 服务器提交请求。一般为 GET 或POST 命令。 3 通过 HTTP 协议传送给 Web 服务器。接纳则进行事务处6 理,处理结果传回客户端。 4 客户和服务器断开连接。 HTTP 采用 TCP 连接,该连接仅在此事务中保持,浏览器和服务器都不会记忆上次的连接状态。 HTTP 之所以采取这种无状态机制,完全是为了提高服务器的工作 效率。在 WEB 中点击一个超链接时,浏览器有可能从当前站点转
13、到另一个站点。因此,当文档传输完毕时,服务器都假定用户要退出对文本服务器上的文档的浏览连接,因而断开连接。如果继续浏览,就再次建立连接。如果用户确实要退出时,服务器就不需要执行任何操作,因为连接已经断开了。 (五) HTTP 消息包括 HTTP 请求信息和 HTTP 响应消息两种 ,一个HTTP 请求格式如下 图五 所示: 图五 HTTP 请求信息格式 HTTP 响应信息格式如 图 六 所示: M e h o d U R L V e r s io n H e a d e r f ie ld n a m e V a lu e H e a d e r f ie ld n a m e V a lu
14、e E n t i t y B o d y 请求头 头信息 V e r s i o n S t a t u s c o d e V e r s i o n H e a d e r f i e l d n a m e V a l u e H e a d e r f i e l d n a m e V a l u e E n t i t y B o d y 回应状态消息 头信息 7 图六 HTTP 响应信息格式 三 HTTP服务器的兼容性 (一) HTTP1.1 的兼容性: 要实现一个实用高效的 HTTP1.1 和 CGI 兼容 HTTP 服务器, HTTP1.1 主要通过引入持久连接和更好的缓存
15、验证命令而提高性能,而且把 HTTP 响应代码增加一倍多。能够向上兼容 HTTP/1.0, HTTP 消息包括请求消息和响应信息两种。 (二) HTTP1.0 的兼容性: HTTP1.0 兼容服务器总是要响应请求的 HTTP 版本,可能是HTTP0.9 或 HTTP1.0。 HTTPResquest 要检查请求中是否存在版本号。如果不存在,则假设为 HTTP0.9。这个版本不用头。其中在 HTTP1.0 版本里请求头的 method 可能为 GET POST 或 HEAD,而在 HTTP1.1 版本中增加了 PUT 和 DELETE 两种请求。 URL 统一资源定位器标明了目的位置。 (三)
16、与旧版本 HTTP 的兼容性: HTTP1.0规范强制要求与 HTTP.09的向下兼容性。我们要保证 HTTP服务器具有下列功能: 1 识别 HTTP0.9 与 HTTP1.0 请求的请 求行格式。 2 了解 HTTP0.9 与 HTTP1.0 格式的任何有效请求。 3 响应与客户机使用的相同协议版本消息。 四 Java 实现多线程 HTTP 服务器设计 (一) Java 语言网络编程 在 java 的客户 /服务器应用中,客户与服务器之间的通讯一般是采用基于 TCP/IP 的 Socket 机制来实现的。当通信数据到达的是8 目的主机网络层, IP地址连同端口号一起,提供了对两台机器之间唯一
17、的无二义性的连接的标识,这个连接叫套接字( Socket)。一对套接字为一标识了每个端口连接:( 1)发送方套接字 =源 IP 地址+源端口号 ;( 2)接收方套接字 =目的 IP 地址 +目的端口号。 Socket 类实现基于连接客户插口。我们可以利用 Java API 中的 J 包中的插口类提供的套接字功能进行网络编程。 Socket 类(套接字类)提供的重要函数有 getInetAddress( ), getPort( ), getInputStream( ), 和 close( )。分别产生用于获得信宿机的地址、信宿机端口号、获得输入流、获得输出流、关闭套接字。 ServerSocke
18、t 类(服务器套接字类)的重要函数有:getInetAddress( ), getLocalPort( ), accept( )和 close( ),分别用于获得信宿机的 Internet 地址、本地端口、监听和关闭套接字。 ServerSocket 类实现了 TCP 服务器插口。它提供两种构造函数指定服务器插口所用的端口,以便监听到连接请求。利用 Accept( )方法引发服务器插口监听并等待,一旦连接就返回一个实例。 自定义类包括( 1) HttpServer 类(服务器类),( 2) ReThead(线程重用类),( 3) HttpProcess(一个接口类)。此外还包括各个类的请求处理
19、 类 3个: HttpFile(静态文件处理) , HttpCGI( CGI处理) ,HttpException(出错处理);以及数据流处理 2 个:HttpInputstream(数据输入流)和 HttpOutputstream(数据输出流)。 9 HTTP Request Http 服务器 初始化 HTTPConfig 初始化 HTTPLog 初始化 HTTPConverter 当浏览器 连接时建立 浏览器 连接 分析器 建立连 接信息 HTTPMessageHeaders HTTPInfo 发回 响应和 对象 HTTPGetHand HTTPHead HTTPHandler 建立 HTT
20、PResponse 生成请求的对象 HTTPFileObject HTTPProcessObject 建立相应处理器 图七 重要类的交互 10 (二) 服务器总体设计 1总体设计的关键点 根据 HTTP 工作原理,在这个设计中抓住了几个关键点:( 1)持续监听。根据 TCP/IP,作为 服务器端进行监听。在这个设计中,采用了一个永真的循环,等待客户的连接请求。( 2)可以同时接受多个用户的连接请求。每个用户拥有自己独立的线程。( 3)实现了线程的重用性。线程重用服务可以自动收集可重用的线程,以免过的的创建与销毁线程增加系统的负担,提高了系统的效率。 2模块设计 把 Http服务器分成两个组成模
21、块:客户请求处理模块和响应生成发送模块,其中客户请求处理模块负责接收客户的连接,分析请求中的各个协议参数,此外还负责调用响应生成发送模块。而响应生成发送模块的任务就是根据对客户请求的分析的结果查找资源,生 成响应和发送响应。 ( 1)客户请求处理模块的任务就是负责监听系统的端口,以获取客户机到达本机的连接。当获得一个连接请求时,就把这一连接所建立的套接字连接交给一个负责客户请求处理程序 Client 类处理这一个客户的请求,之后程序继续监听等待下一个客户的连接。在一个Client 对象建立之后,它就把其在初始化时获得的一个 Socket 对象的输入流重定向给一个 Request 对象,使其能通过 Request 类提供的接口方法获取这一用户请求的相关参数,如 URL的组成请求方法,所指文件以及协议版本等数据。然后把这一个 Request 对象连同 Socket 对象的输出流传递给一个 ResourceHandler 类 的 实 例 , 由 这 一 个ResourceHandler 对象完成生产发送对用户请求的响应。主要由三个部分组成:守护程序:一个 HttpServer 类的实例对象;客户处理程