荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: icefire (......), 信区: Java
标  题: JAVA 语 言 多 路 广 播 技 术 在INTERNET 上 的 应 狔1*@毵*@蘁
发信站: BBS 荔园晨风站 (Mon Feb  1 09:30:39 1999), 转信 (WWW POST)

@p**
#localpost:

JAVA 语 言 多 路 广 播 技 术 在INTERNET 上 的 应 用
尤 克( 沈 阳 先 达 公 司)
余 英( 北 方 电 脑 公 司)
E-mail: yuchenyang@hotmail.com

--------------------------------------------------------------------------------

---- 关 键 词: 多 路 广 播, TCP, UDP, 路 由 器
---- Abstract: This paper introduce general concept and the application of
Multi-cast Broadcast technology in internet and intranet. It also illustrates
how to accomplish this technology via JAVA language.


---- 随 着 互 连 网 络 的 发 展,JAVA 语 言 作 为 一 种 跨 平 台、 灵 活 高 效
的 编 程 语 言 越 来 越 普 及。

---- 由 于JAVA 语 言 是 建 立 在 网 络 基 础 上 的, 所 以 用JAVA 语 言 开 发 基
 于 网 络 的 应 用 程 序 十 分 方 便。

---- JAVA 语 言 在 通 过 类 的 抽 象 简 化 网 络 编 程 难 度 的 同 时, 提 供 了
 许 多 其 他 语 言(C,PASCAL) 不 提 供 的 网 络 编 程 接 口。 本 文 简 要 介 绍
JAVA 语 言 多 路 广 播 技 术 的 原 理 及 应 用。

一. 多 路 广 播 技 术 的 原 理
---- 欲 理 解 多 路 广 播 技 术, 首 先 要 对TCP/IP 网 络 有 一 个 基 础 的 了
解。 众 所 周 知,TCP/IP 协 议 主 要 是 为 了 实 现 点 对 点 通 讯 设 计 的。 为
 了 实 现 点 对 点 通 讯,TCP/IP 网 络 系 统 提 供 了 两 种 通 讯 协 议, 传 输
 控 制 协 议TCP 和 用 户 报 文 协 议UDP。
---- TCP 协 议 是 面 向 连 接 的, 在 实 现TCP 传 输 前,TCP 协 议 通 过 一 些“
 握 手” 协 议 以 确 保 连 接 的 可 靠 性。 在 发 送 一 段 数 据 中, 发 送 方
把 发 送 的 数 据 与 发 送 时 间 和 序 列 号 一 起 存 放, 如 果 接 受 方 正 确
 接 受, 则 接 受 方 发 出 一 个 应 答 表 示 信 息 收 到 并 且 正 确。 发 送 方
 收 到 对 方 应 答 之 后 才 放 弃 发 送 这 段 数 据。

---- 如 果 发 送 方 在 一 段 时 间 没 有 收 到 应 答, 则 重 新 发 送 数 据, 如
 果 发 生 失 败 的 次 数 太 多, 则TCP 系 统 放 弃 传 输, 认 为 网 络 出 现 问
 题, 同 时 告 诉 系 统 用 户 发 生 失 败。

---- UDP 协 议 与TCP 协 议 不 同 的 是。 它 不 需 要 通 过 一 些“ 握 手” 协 议
 以 确 保 连 接 的 可 靠 性。 发 送 方 直 接 把 数 据 广 播 到 网 络 上, 任 何
 欲 接 受 者 都 可 以 接 受 到 数 据。

---- 在 广 播 消 息 中, 数 据 的 目 标 不 是 指 定 为 地 址 唯 一 的 一 台 机
器, 而 是 特 殊 的 广 播 地 址( 数 据 既 可 以 发 送 到 同 一 子 网 的 所 有
机 器, 也 可 以 发 送 到 同 一 网 络 上 的 所 有 机 器)。

---- 以 上 两 种 协 议 各 有 优 缺 点, 从 编 程 角 度 来 看,TCP 协 议 更 容 易
 使 用, 因 为 它 确 保 了 连 接 的 可 靠 性。 除 非 发 生 重 大 问 题, 否 则
发 送 方 和 接 受 方 都 知 道 读 取 和 写 入 的 数 据 被 所 要 的 机 器 以 同 样
 的 顺 序 正 确 接 受 到。 发 送 方 知 道 如 果 无 法 验 证 传 送, 则 会 收 到
 消 息。 如 果 使 用UDP, 则 需 要 编 程 人 员 实 现 验 证 和 修 复 机 制。

---- 但 是 由 于TCP 实 现 了 通 讯 的 验 证, 它 的 传 输 速 度 较 慢。 同 时,
 从TCP 的 原 理 可 以 看 出, 由 于TCP 协 议 是 面 向 连 接 的, 它 实 现 的 是
 单 点 — — 单 点 的 通 讯, 而 不 能 实 现 组 对 组 间 的 通 讯。 为 了 实 现
 一 点 对 多 点 的CLIENT-SERVER 方 式 通 讯, 常 常 通 过 在 服 务 器 端 并 发
多 个 线 程 来 实 现, 这 自 然 加 大 了 服 务 器 的 负 担。

---- 相 对 于TCP 协 议,UDP 提 供 了 高 效 的 网 络 通 讯 方 式( 以 减 低 通 讯
 可 靠 性 为 代 价), 它 的 广 播 方 式 更 提 供 了 多 主 机 间 同 时 通 讯 的
 机 制, 但 它 在 使 用 中 有 以 下 缺 点:

通 信 必 须 发 生 在 本 地 子 网( 最 多 为 同 一 逻 辑 网 络) 上 的 主 机 之 间


在 广 域 网 用 网 桥 和 路 由 器 分 开 时, 分 组 的 数 据 包 要 经 过 每 个 网
 络 段, 即 使 该 段 没 有 需 要 接 受 数 据 的 主 机, 这 会 增 加 网 络 的 带
 宽 需 求, 产 生 我 们 通 常 所 说 的“ 广 播 风 暴”。 所 以 在 实 际 应 用 中
, 大 部 分 路 由 器 都 把“BROADCAST FORWARD” 功 能 关 闭, 限 制 了UDP 在 广
 域 网 上 的 应 用。
---- 为 了 解 决 以 上 问 题, 我 们 引 入 了 多 路 广 播 的 机 制, 多 路 广 播
 是 利 用 特 定 范 围 的IP 地 址 达 到 的。 这 些 地 址 与 特 定 的 机 器 不 相
 关, 而 是 由 一 组 机 器 将 自 己 与 这 个 地 址 相 关 联 而 实 现 的。 同 时
, 为 了 使 一 组 机 器 与 多 路 广 播 地 址 相 关 联, 连 接 的 路 由 器 必 须
 知 道 这 个 关 联 和 机 器 之 间 的 路 由。 以 后, 任 何 发 往 这 组 地 址 的
 数 据 包 都 会 广 播 到 组 中 的 每 个 机 器, 路 由 器 直 接 定 向 传 送, 使
 不 在 组 内 的 机 器 不 会 收 到 数 据, 即 节 省 了CPU 时 间 去 放 弃 无 用 包
 又 提 高 了 网 络 带 宽 的 利 用 率。

二. JAVA 语 言 下 多 路 广 播 技 术 的 设 计 与 实 现
---- 多 路 广 播 技 术 的 应 用 十 分 广 泛。 理 论 上 来 说, 任 何 用UDP 方 式
 实 现 的 网 络 应 用 都 可 以 用 多 路 广 播 技 术 来 实 现。 它 尤 其 适 用 于
 在 复 合 网 络 环 境 下 多 机 同 时 接 受 同 一 数 据 的 程 序。 如 会 议, 新
 闻 发 布, 网 络 多 用 户 游 戏 和 系 统 仿 真。 事 实 上, 大 多 数 路 由 器
用“ 交 互 路 由 表” 动 态 确 定 网 络 路 由 信 息 的IGRP 和RIP-2 协 议 就 是
在 多 路 广 播 的 基 础 上 发 展 出 来 的。
---- 用JAVA 实 现 多 路 广 播 相 对 比 较 容 易, 但 要 注 意 以 下 几 点。

在PC 几 中, 只 有WIN95,WINNT 和UNIX( 如SCOUNIX,LINUX)) 操 作 系 统 支 持 多
 路 广 播, 所 有UNIX 工 作 站 都 支 持 多 路 广 播。

请 使 用JDK1.1 开 发 多 路 广 播。 因 使 用JDK1.1 以 前 版 本 有 许 多 错 误。(
 注 意: VJ 1.1 并 不 支 持JDK1.1, 需 安 装 补 丁 程 序)
---- 以 下 是 一 个 多 路 广 播 服 务 器 和 客 户 机 的 简 例 服 务 器:

import java.awt.*;
import java.io.*;
import java.net.*

public class Multi_Cast_Server
 {
   MulticastSocket  ms;
   DatagramPacket  dp;
          InetAddress      addr;
   Int             port=9090;

   public static void main(String args[]) throws Exception
   {
     Multi_Cast_Server mcs=new Multi_Cast_Server("my-server");
                mcs.go();
   }//end main

   public Multi_Cast_Server(String str) throws Exception
          {
                addr=InetAddress.getByName(str);
                ms=new MulticastSocket();
                ms.joinGroup(addr);
          }

          public void go() throws Exception
          {
        byte[] buffer=null;
                for (;;)
                {
                        System.out.printlb(" 发 送 数 据");
                        String s="This is a test";
                        Buffer=s.getBytes();
                        dp=new DatagramPacket(buffer,s.length(),addr,port);
                        ms.send(dp,(byte)1);
                }
          } //end go
}



 客 户 机:

import java.awt.*;
import java.io.*;
import java.net.*

public class Multi_Cast_Client
 {
   MulticastSocket  ms;
   DatagramPacket  dp;
          int port      =9090;

   public static void main(String args[]) throws Exception
   {
     Multi_Cast_Server mcc=new Multi_Cast_Client("my-server");
                mcc.go();
   }//end main

   public Multi_Cast_Client(String str) throws Exception
          {
                ms=new MulticastSocket(port);
                ms.joinGroup(str);
          }

          public void go() throws Exception
          {
        byte[] buffer=new byte[64];
dp=new DatagramPacket(buffer,buffer.length);
                String s;
                for (;;)
                {
                        ms.receive(dp);
                        s=new String(dp.getDate());
                        System.out.printlb(" 接 受 数 据"+s);
                }
          } //end go
}
---- 本 文 只 是 简 要 介 绍 了 多 路 广 播 技 术 的 基 本 原 理 和 实 现 方 法
, 使 用 者 可 以 根 据 自 己 的 需 要 在 各 自 的 系 统 开 发 中 灵 活 应 用。
 随 着 复 合 网 络 和 广 域 网 的 普 及, 多 路 广 播 技 术 在 我 们 的 网 络 系
 统 中 的 应 用 会 越 来 越 广 泛。


--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.30]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店