|
教 学 纲 要 Java 为我 们 提 供 了 强 有 力 的 网 络 功 能 , 也 正 是 由 于 它 的 强 大 的网 络 功 能 的 支 持 , Java 才 得 到 大 家 如 此 的 青 睐 。 不 信 你去 试 试 , 开 发 类 似 的 网 络 程 序 用 其 他 编 程 语 言 比 用 Java 复 杂 得 多 。
Java 语 言 是 运 用 于 网 络 环 境 的 一 种 编 程 语 言 , Java 的 程 序 要能 在 网 络 上 的 不 同 地 方 运 行 , 这 样 就 要 求 Java 程 序 执 行时 , 必 须 有 能 力 取 得 网 络 上 的 各 种 资 源 和 数 据 , 和 服 务器 建 立 各 种 传 输 通 道 , 把 自 己 的 数 据 传 输 到 网 络 各 处 。 Java 为 我 们 提 供 了 强 有 力 的 网 络 功 能 , 也 正 是 由 于 它 的强 大 的 网 络 功 能 的 支 持 , Java 才 得 到 大 家 如 此 的 青 睐 。不 信 你 去 试 试 , 开 发 类 似 的 网 络 程 序 用 其 他 编 程 语 言 比用 Java 复 杂 得 多 。 Java 所 提 供 的 网 络 功 能 可 以 分 为 三 类 :用 URL 访 问 网 络 资 源 、 Socket 方 式 、 数 据 报 方 式 。 其 中 Socket 和 数 据 报 方 式 比 较 复 杂 , 我 们 只 介 绍 URL 的 有 关 内 容 。 Java 中 的 URL 类 URL 也 就 是 Uniform Resourse Locator ( 统 一 资源 定 位 器 ) , 如 果 你 用 过 WWW 浏 览 器 , 一 定 知 道 URL 。 每次 想 要 访 问 网 络 上 的 某 个 地 方 , 首 先 要 填 写 它 的 URL 。 顾名 思 义 , URL 用 于 表 示 网 络 资 源 的 地 址 。 网 络 上 的 资 源 都有 它 固 定 的 地 址 , 使 用 时 , 必 须 首 先 知 道 它 的 URL , 通 过 URL 指 定 的 方 法 获 取 网 络 资 源 。 网 络 资 源 的 URL 就 如 同 我们 每 个 人 的 住 址 , 我 们 记 住 了 朋 友 的 住 址 才 能 登 门 拜 访, 网 络 资 源 也 一 样 , 我 们 知 道 了 它 们 的 “ 住 址 ” 即 URL ,才 能 访 问 到 它 们 。 例 如 从 网 上 获 取 Java 开 发 工 具 , 我 们曾 经 访 问 过 Sun 公 司 的 Java Web 网 点 , 它 的 URL 为 : http: // www.Javasoft.com , 从 这 里 你 可 以 看 到 许 多 与 Java 有 关 的 文 档。 有 规 律 的 URL 结 构 如 果 你 经 常 使 用 WWW 浏 览 器 的 话 , 一 定记 录 了 许 多 URL , 是 不 是 已 经 发 现 了 URL 的 结 构 规 律 ? URL 的 结 构 分 为 两 部 分 : 传 输 协 议 和 资 源 名 称 , 中 间 用 “ : // ” 分 隔 开 。 传 输 协 议 说 明 访 问 资 源 时 使 用 的 网 络 协 议。 典 型 的 传 输 协 议 有 http 、 ftp 还 有 gopher 、 file 、 news 等 。 资 源 名 称 的 格 式 与 所 使 用 的 传 输 协 议有 关 , 通 常 由 下 列 结 构 格 式 中 的 一 个 或 几 个 组 成 : - 主 机 名 称 ( host name ) : 资 源 所
在 的 主 机 的 名称 。 主 机 名 称 由 几 个 域 组 成 , 各 个 部 分 之 间 由 “ . ” 分隔 开 。 各 部 分 的 顺 序 类 似 于 英 语 中 的 地 址 书 写 方 式 , 较大 的 单 位 写 在 后 面 。 一 般 最 末 尾 的 域 , 即 一 级 域 代 表 国家 和 地 区 , 依 此 类 推 , 第 二 级 域 代 表 部 门 , 其 他 的 域 代表 个 人 的 一 些 信 息 。 - 文 件 名 ( file name) : 资 源 在 机 器
上 的 完 整 名 字。 这 里 的 文 件 名 并 不 是 简 单 的 名 字 , 它 要 包 括 文 件 的 完整 的 路 径 名 , 这 样 我 们 才 能 直 接 通 过 文 件 名 访 问 到 一 个文 件 。 - 端 口 号 ( port number) : 连 接 时 所
使 用 的 服 务 器端 口 号 。 查 看 一 下 你 收 集 的 URL , 许 多 都 没 有 端 口 号 , 因为 通 信 协 议 一 般 都 已 经 规 定 好 连 接 时 使 用 的 端 口 号 , 所以 这 部 分 常 被 省 略 。 - 参 考 点 ( reference ) : 资 源 中 的
特 定 位 置 , 用来 标 识 一 个 文 件 中 特 定 的 偏 移 位 置 。 通 过 参 考 点 我 们 可以 对 一 个 文 件 中 感 兴 趣 的 部 分 创 建 URL 对 象 。 实 际 上 , 我 们 用 到 的 绝 大 部 分 URL 地 址 的资 源 名 称 只 包 括 主 机 名 称 和 文 件 名 , 图 19.1 中 分 析 一 个我 们 熟 悉 的 URL 的 结 构 , 它 属 于 最 常 用 的 类 型 : 图 19.1 URL 地 址 结 构 URL 类 有 四 种 构 造 方 法 Java 中 专 门 设 计 了 URL 类 java.net.URL , URL 类 所 产 生 的 对 象 就 指 定 了 一 个 网 络 资 源 的 地 址 , 也 就 代表 了 URL 所 指 定 的 网 络 资 源 。 URL 类 定 义 了 四 种 不 同 的 构造 方 法 , 用 户 说 明 对 象 时 根 据 需 要 任 意 选 取 。 1. URL(String URLaddress) 首 先 介 绍 的 是 一 种 最 简 单 的 构 造 方 法, 这 种 构 造 方 法 把 网 络 资 源 的 URL 地 址 作 为 参 数 , 以 字 符串 的 形 式 直 接 传 入 方 法 内 。 让 我 们 使 用 URL 地 址 “ http: // www.javasoft.com/java/index.html ” 创 建 一 个 对 象 , 可 以 用 如 下 的 方 法 : URL htmlfile = new URL("http: // www.javasoft.com/java/index.html"); 这 种 构 造 方 法 是 在 已 知 一 个 URL 地 址 后, 直 接 把 它 作 为 参 数 创 建 一 个 URL 对 象 。 2. URL(URL URLaddress,String refer) 这 是 一 种 类 似 于 “ 段 地 址 ” 和 “ 偏 移量 ” 的 地 址 表 示 方 法 。 大 部 分 情 况 下 我 们 可 以 利 用 已 有的 URL 地 址 信 息 , 结 合 要 访 问 的 另 一 种 资 源 的 有 关 信 息 ,确 定 一 个 新 的 资 源 。 例 如 某 个 应 用 程 序 要 访 问 存 放 在 同 一目 录 下 的 一 组 HTML 文 件 , 首 先 创 建 一 个 完 整 的 URL 地 址 ,表 示 HTML 文 件 所 在 的 目 录 , 以 后 每 次 只 需 使 用 已 创 建 的完 整 URL 地 址 和 文 件 名 , 就 可 以 创 建 新 的 URL 对 象 访 问 另外 的 文 件 。 这 里 的 URL 地 址 作 为 “ 段 地 址 ” , 文 件 名 作 为 “ 偏 移 量 ” 。 下 面 我 们 用 这 种 构 造 方 法 对 两 个 在 同一 目 录 下 的 URL 创 建 对 象 : URL dictory = new URL("http: // www.javasoft.com/nav/read/"); URL htmlfile1 = new URL(dictory , "docindex.html"); URL htmlfile2 = new URL(dictory , "products.html"); 我 们 为 网 点 http:// www.javasoft.com 的 目 录 /nav/read/ 下 的 两 个 文 件 docindex.html 和 products.html 创 建 URL 对象 , 首 先 创 建 作 为 “ 段 地 址 ” 的 URL 地 址 , 然 后 以 文 件 名作 为 “ 偏 移 量 ” , 创 建 要 求 的 URL 对 象 。 这 种 方 法 允 许 我们 使 用 参 考 点 , 从 文 件 不 同 的 位 置 开 始 创 建 URL 对 象 。 实 际 上 第 一 种 构 造 方 法 可 以 用 第 二 种方 法 实 现 , 只 要 取 “ 段 地 址 为 null , 整 个 URL 地 址 作 为 ” 偏 移 量 : URL htmlfile = new URL(null,"http: // www.javasoft.com/java/index.html"); 3. URL(String protocol,String host,int port,String file) 这 种 构 造 方 法 使 用 也 比 较 简 单 , 只 需按 顺 序 填 写 URL 地 址 的 各 部 分 信 息 : 传 输 协 议 、 主 机 名 称、 端 口 号 和 文 件 名 即 可 创 建 URL 对 象 。 这 种 构 造 方 法 中 没 有 提 供 参 考 点 参 数, 所 以 不 允 许 使 用 参 考 点 , 我 们 只 能 对 整 个 文 件 创 建 URL 对 象 。 下 面 的 例 子 中 使 用 URL 地 址 “ http:// www.opentext.com:8080/omw.html ” 创 建 一 个 对 象 : URL htmlfile = new URL("http", "www. opentext.com",8080, "omw.html"); 我 们 已 经 知 道 许 多 URL 地 址 并 没 有 端 口号 , 这 些 URL 创 建 对 象 时 可 以 使 用 下 面 的 第 四 种 构 造 方 法。 4. URL(String protocol,String host,String file) 这 种 构 造 方 法 的 使 用 与 第 三 种 相 似 ,适 合 于 没 有 端 口 号 的 URL 地 址 。 同 第 三 种 方 法 一 样 , 不 允许 使 用 参 考 点 。 下 面 的 例 子 中 我 们 创 建 了 一 个 与 方 法 一相 同 的 URL 对 象 。 URL htmlfile = new URL("http", "www.javasoft.com", "java/index.html"); 如 果 创 建 URL 对 象 时 有 错 误 , 如 URL 地 址参 数 不 正 确 , 传 输 协 议 不 符 合 要 求 等 , 构 造 方 法 会 输 出 MalformedURLException 例 外 , 我 们 在 这 一 章 的 例 子 中 都 用 了 例外 处 理 try 和 catch , 先 别 说 你 不 认 识 它 们 , 它 们 不 会 影 响你 对 程 序 的 理 解 。 本 书 后 面 的 章 节 中 会 讲 到 例 外 处 理 方法 。 URL 类 的 基 本 方 法 URL 类 中 定 义 了 许 多 简 单 实 用 的 小 方 法, 我 们 可 以 利 用 它 们 进 行 一 些 有 关 URL 的 操 作 。 1. 获 取 URL 信 息 - getProtocol( ) : 获 取 URL 中 的 传 输 协
议 , 返 回 值为 String 。 - getHost( ) : 获 取 URL 中 的 主 机 名 称
, 返 回 值 为 String 。 - getPort( ) : 获 取 URL 中 的 端 口 号 ,
返 回 值 为 int , 如 果 一 个 URL 地 址 没 有 端 口 号 , 返 回 值 为 -1 。 - getFile( ) : 获 取 资 源 的 文 件 名 ,
返 回 值 为 String 。 - getRef( ) : 获 取 URL 中 的 参 考 点 ,
返 回 值 为 String , 如 果 一 个 URL 地 址 没 有 参 考 点 , 返 回 值 为 null 。 上 面列 出 的 五 个 小 方 法 分 别 用 于 获 取 URL 地 址 结 构 的 有 关 信 息, 我 们 通 过 一 个 例 子 来 看 看 它 们 的 使 用 方 法 。 程 序 19.1 // 创 建 如 下 的 源 程 序 sample.java import java.net.URL; // 引 入 类 import java.net.MalformedURLException; class sample { public static void main(String args[]) { URL sampleURL = null; try { sampleURL = new URL("http: // www.opentext.com:8080/omw.html"); // 创 建 URL 对 象 } catch(MalformedURLException e) // 异 常 处理 { System.out.println("MalformedURLException:"+e);} System.out.println("Protocol: "+sampleURL.getProtocol( )); // 显 示 结 果 System.out.println("Host Name: "+sampleURL. getHost( )); System.out.println("Port Number: "+sampleURL.getPort( )); System.out.println("File Name: "+sampleURL.getFile( )); System.out.println("Reference: "+sampleURL.getRef( )); } } 这 是 一 个 Java 应 用 程 序 , 因 为 程 序 中 包含 了 如 : public static void main ( ) { … … } 这 条 语 句 。 前 面已 经 讲 过 Java 应 用 程 序 不 需 要 HTML 文 件 来 进 行 加 载 就 可 以独 立 执 行 。 如 果 使 用 JDK 作 为 开 发 环 境 , 其 编 译 和运 行 过 程 如 下 : C:JAVAEXAM>javac sample.java C: JAVAEXAM >java sample 如 果 使 用 Symantec Cafe , 编 译 和 运 行 过 程和 Applet 一 样 ( 详 见 第 三 章 ) 。 输 出 结 果 显 示 在 Output 窗 口中 。 程 序 19.1 运 行 结 果 为 : Protocol: http Host Name: www.opentext.com Port Number: 8080 File Name: /omw.html Reference: null 程 序 19.1 运 行 结 果 输 出 URL 地 址 的 传 输协 议 、 主 机 名 称 、 端 口 号 和 文 件 名 , URL 没 有 参 考 点 , 输出 为 null 。 2. 将 URL 的 内 容 转 成 字 符 串 建 立 好 URL 对 象 以 后 , 有 两 种 方 法 可 以将 它 的 内 容 转 成 字 符 串 : String toString( ) String toExternalForm( ) 下 面 的 程 序 19.2 说 明 了 这 两 种 方 法 的 用法 : 程 序 19.2 // change.java import java.net.URL; import java.net.MalformedURLException; class change { public static void main(String args[]) { URL url = null; try { url = new URL("http: // www.obscure.org/~jaws/htmltoolkit.html"); // 创 建 URL 对 象 } catch(MalformedURLException e) // 异 常 处理 { System.out.println("MalformedURLException:"+e);} System.out.println("The URL is: "+url.toString( )); // 显 示 结 果 System.out.println("The URL is: "+url.toExternalForm( )); } } 编 译 和 运 行 过 程 如 下 : C:JAVAEXAM>javac change.java C:JAVAEXAM>java change 程 序 19.2 运 行 结 果 为 : The URL is: http: // www.obscure.org/~jaws/htmltoolkit.html The URL is: http: // www.obscure.org/~jaws/htmltoolkit.html 从 程 序 运 行 结 果 我 们 可 以 看 到 , 两 种方 法 实 现 了 同 样 的 功 能 , 将 URL 地 址 转 换 成 字 符 串 。 3. 比 较 两 个 URL 的 数 据 方 法 sameFile 能 够告 诉 你 两 个 URL 的 数 据 是 否 相 等 : boolean sameFile(URL other) 通 过 下 面 的 程 序 19.3 可 以 明 白 方 法 sameFile 的 使 用 。 程 序 19.3 // 创 建 源 程 序 Test.java : import java.net.URL; // 引 入 类 import java.net.MalformedURLException; class Test { public static void main(String args[]) { URL url1 = null,url2 = null,url3 = null; try { url1 = new URL("http: // www.obscure.org/~jaws/htmltoolkit.html"); // 创 建 URL 对 象 url2 = new URL("http: // www.obscure.org/~jaws/htmltoolkit.html"); url3 = new URL("http: // www.ziff.com/~eamonn/crash_course.html"); } catch(MalformedURLException e) // 异 常 处 理 { System.out.println("MalformedURLException:"+e);} System.out.println("The first url1: "+url1); // 显 示 结 果 System.out.println("The second url2: "+url2); System.out.println("The third url3: "+url3); System.out.println("(url1 == url2) is "+url1.sameFile(url2)); // 显 示 结 果 System.out.println("(url1 == url3) is "+url1.sameFile(url3)); System.out.println("(url2 == url3) is "+url2.sameFile(url3)); } } 编 译 和 运 行 的 过 程 如 下 : C:javaexam>javac Test.java C:javaexam>java Test 程 序 19.3 运 行 结 果 为 : The first url1: http: // www.obscure.org/~jaws/htmltoolkit.html The second url2: http: // www.obscure.org/~jaws/htmltoolkit.html The third url3: http: // www.ziff.com/~eamonn/crash_course.html (url1 == url2) is true (url1 == url3) is false (url2 == url3) is false
|