[Onejava Studio Web][JAVA]如何用Java实现Web服务器
广西财政高等专科学校徐辉


第一页
一、HTTP 协 议 的 作 用 原 理

WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基 本的传输单位是Web网页。WWW的工作基于客户机/ 服务器计 算模型,由Web浏览器( 客 户 机)和Web服务器( 服 务 器) 构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web 服务器之间的应用层协议,是通用的、无状态的、面向对象 的协议。HTTP协议的作用原理包括四个步骤:

1.连 接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建 立成功。

2.请求:Web浏览器通过socket向Web服务器提交请求。HTTP 的请求一般是GET或POST命令(POST 用于FORM参数的传递)。GET命令的格式为:GET路径/ 文件名 HTTP/1.0 文件名指 出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。

3.应答:Web 浏 览 器 提 交 请 求 后, 通 过HTTP 协 议 传 送 给Web 服 务 器。Web 服 务 器 接 到 后, 进 行 事 务 处 理, 处 理 结 果 又 通 过HTTP 传 回 给Web 浏 览 器, 从 而 在Web 浏 览 器 上 显 示 出 所 请 求 的 页 面。

例: 假 设 客 户 机 与www.mycompany.com:8080/mydir/index.html 建 立 了 连 接, 就 会 发 送GET 命 令:GET /mydir/index.html HTTP/1.0。 主 机 名 为www.mycompany.com 的Web 服 务 器 从 它 的 文 档 空 间 中 搜 索 子 目 录mydir 的 文 件index.html。 如 果 找 到 该 文 件,Web 服 务 器 把 该 文 件 内 容 传 送 给 相 应 的Web 浏 览 器。

为 了 告 知 Web 浏 览 器 传 送 内 容 的 类 型,Web 服 务 器 首 先 传 送 一 些HTTP 头 信 息, 然 后 传 送 具 体 内 容( 即HTTP 体 信 息),HTTP 头 信 息 和HTTP 体 信 息 之 间 用 一 个 空 行 分 开。 常 用 的HTTP 头 信 息 有:

① HTTP 1.0 200 OK
这 是Web 服 务 器 应 答 的 第 一 行, 列 出 服 务 器 正 在 运 行 的HTTP 版 本 号 和 应 答 代 码。 代 码"200 OK" 表 示 请 求 完 成。
② MIME_Version:1.0
它 指 示MIME 类 型 的 版 本。
③ content_type: 类 型
这 个 头 信 息 非 常 重 要, 它 指 示HTTP 体 信 息 的MIME 类 型。 如:content_type:text/html 指 示 传 送 的 数 据 是HTML 文 档。
④ content_length: 长 度 值
它 指 示HTTP 体 信 息 的 长 度( 字 节)。

4关 闭 连 接: 当 应 答 结 束 后,Web 浏 览 器 与Web 服 务 器 必 须 断 开, 以 保 证 其 它Web 浏 览 器 能 够 与Web 服 务 器 建 立 连 接。



实用技巧
--------------------------------------------------------------------------------
如何用Java实现Web服务器 广西财政高等专科学校徐辉

[篇幅所限,此处仅为摘要,可下载原文,Zip 20KB]

第二页

二、Java 实 现Web 服 务 器 功 能 的 程 序 设 计

根 据 上 述HTTP 协 议 的 作 用 原 理, 实 现GET 请 求 的Web 服 务 器 程 序 的 方 法 如 下:

1. 创 建ServerSocket 类 对 象, 监 听 端 口8080。 这 是 为 了 区 别 于HTTP 的 标 准TCP/IP 端 口80 而 取 的;

2.等 待、 接 受 客 户 机 连 接 到 端 口8080, 得 到 与 客 户 机 连 接 的socket;

3. 创 建 与socket 字 相 关 联 的 输 入 流instream 和 输 出 流outstream;

4. 从 与socket 关 联 的 输 入 流instream 中 读 取 一 行 客 户 机 提 交 的 请 求 信 息, 请 求 信 息 的 格 式 为:GET 路 径/ 文 件 名 HTTP/1.0

5. 从 请 求 信 息 中 获 取 请 求 类 型。 如 果 请 求 类 型 是GET, 则 从 请 求 信 息 中 获 取 所 访 问 的HTML 文 件 名。 没 有HTML 文 件 名 时, 则 以index.html 作 为 文 件 名;

6.如 果HTML 文 件 存 在, 则 打 开HTML 文 件, 把HTTP 头 信 息 和HTML 文 件 内 容 通 过socket 传 回 给Web 浏 览 器, 然 后 关 闭 文 件。 否 则 发 送 错 误 信 息 给Web 浏 览 器;

7. 关 闭 与 相 应Web 浏 览 器 连 接 的socket 字。

下 面 的 程 序 是 根 据 上 述 方 法 编 写 的、 可 实 现 多 线 程 的Web 服 务 器, 以 保 证 多 个 客 户 机 能 同 时 与 该Web 服 务 器 连 接。
.
.
.
程 序 中 的ConnectionThread 线 程 子 类 用 来 分 析 一 个Web 浏 览 器 提 交 的 请 求, 并 将 应 答 信 息 传 回 给Web 浏 览 器。 其 中,getrequest() 方 法 用 来 检 测 客 户 的 请 求 是 否 为"GET";getfilename(s) 方 法 是 从 客 户 请 求 信 息s 中 获 取 要 访 问 的HTML 文 件 名;sendfile() 方 法 把 指 定 文 件 内 容 通 过socket 传 回 给Web 浏 览 器。

对 上 述 程 序 的getrequest() 方 法 和 相 关 部 分 作 修 改, 也 能 对POST 请 求 进 行 处 理。

三、 运 行 实 例

为 了 测 试 上 述 程 序 的 正 确 性, 将 编 译 后 的WebServer.class、ConnectionThread.class 和 下 面 的index.html 文 件 置 于 网 络 的 某 台 主 机 的 同 一 目 录 中( 如: 主 机NT40SRV 的C:\JWEB 目 录)。

程 序2:index.html 文 件


< HTML >
< HEAD >
< META HTTP-EQUIV="Content-Type"
content="text/html; charset=gb_2312-80" >
< TITLE >Java Web 服 务 器< /TITLE >
< /HEAD >
< BODY >
< h3 > 这 是 用JAVA 写 出 的WEB 服 务 器 主 页< /h3 >
1998 年8 月28 日
< hr >
< /BODY >
< /HTML >
首 先 在 该 主 机 上 用java 命 令 运 行WebServer.class:
C:\jweb >java webserver

然 后 在 客 户 机 运 行 浏 览 器 软 件, 在URL 处 输 入WebServer 程 序 所 属 的URL 地 址( 如:http://nt40srv:8080/index.html), 就 在 浏 览 器 窗 口 显 示 出 指 定 的HTML 文 档。

注 意, 不 能 缺 省 端 口 号8080, 如 缺 省, 则 运 行 该 主 机 的 正 常WEB 服 务 器。

说 明, 不 具 备 网 络 条 件 的 可 在 安 装 了Windows 95 的 单 机 上 进 行 测 试, 方 法 是 用localhost 或127.0.0.1 代 替URL 地 址 的 域 名 部 分, 即URL 地 址 为http://localhost:8080。