第二十一讲 网络功能(一)

Java网络编程之URL详解
本文深入探讨Java中URL的概念及应用,介绍了URL类的构造方法与基本操作,包括如何创建URL对象、获取URL信息及比较URL数据。
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

教 学 纲 要

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:/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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值