教 学 纲 要
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 对 象 。

图 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:/JAVA/EXAM>javac sample.java
C:/ JAVA/EXAM >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:/JAVA/EXAM>javac change.java
C:/JAVA/EXAM>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:/java/exam>javac Test.java
C:/java/exam>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
Java网络编程之URL详解
本文深入探讨Java中URL的概念及应用,介绍了URL类的构造方法与基本操作,包括如何创建URL对象、获取URL信息及比较URL数据。

被折叠的 条评论
为什么被折叠?



