荔园在线

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

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


发信人: icefire (......), 信区: Java
标  题: Java RMI 应 用
发信站: BBS 荔园晨风站 (Mon Feb  1 09:35:59 1999), 站内信件 (WWW POST)

Java RMI 应 用
黄 朝 与(E-mail: COLIN@PUBLIC.BTA.NET.CN)
地 址:(100027) 北 京 东 湖 别 墅 办 公 楼7 层

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

---- 作 为 一 种 优 秀 的 计 算 平 台,Java 在 许 多 方 面 具 有 其 突 出 的 优
 越 性。 其 中,RMI 最 典 型 地 展 现 了Java 平 台 强 大 的 分 布 计 算 能 力。
 本 文 用 一 个 简 单 的 例 子 说 明RMI 给 分 布 计 算 带 来 的 方 便, 以 及
RMI 对 很 多 应 用 领 域 的 重 要 意 义, 如 桌 面 超 级 计 算 的 可 能 性。

---- 简 言 之,RMI 是 一 种Java 虚 拟 机 之 间 对 象(Object) 互 相 调 用 对 方
 函 数, 启 动 对 方 进 程 的 一 种 机 制, 用 这 种 机 制, 某 一 台Java 虚 拟
 机 上 的 对 象 在 调 用 另 外 一 台Java 虚 拟 机 上 的 函 数 时, 使 用 的 程
序 语 法 规 则 和 在 本 台Java 虚 拟 机 上 对 象 间 的 函 数 调 用 的 语 法 规
则 一 样。 正 是 这 种 机 制 给 分 布 计 算 的 系 统 设 计, 编 程 都 带 来 了
极 大 的 方 便。 只 要 按 照RMI 规 程 设 计 程 序, 你 可 以 不 必 再 过 问 在
RMI 之 下 的 网 络 细 节 了, 如TCP/IP,Socket 等 等, 更 不 必 担 心 其 下 面
的 软 硬 件 环 境。 任 意 两 台Java 虚 拟 机 之 间 的 通 讯 完 全 由Java 虚 拟
机 自 己 的RMI 来 负 责。 对 程 序 员 来 讲, 这 两 台Java 虚 拟 机 之 间 完 全
 是 透 明 的, 远 在 天 边 的Java 虚 拟 机 上 的 对 象, 使 用 起 来 就 象 近 在
 眼 前 一 样。

范 例
---- 下 面 的 例 子 是 利 用RMI 设 计 的 一 个 简 单 的 网 络 计 算 器, 其 功
能 是 一 个 三 阶 多 项 式 的 求 值, 然 后 画 出 轨 迹。 读 者 如 没 有 时 间,
 在 阅 读 时 暂 时 不 必 细 究 其 语 法 细 节, 特 别 是 有 些 用IBM 的
VisualAge for Java 自 动 生 成 的 用 户 界 面 代 码, 但 从 该 例 子 的 程 序 结
 构 中, 你 可 足 以 了 解RMI 简 明 的 风 格。 另 外, 本 文 主 要 从 应 用 的
角 度 讨 论RMI, 省 去 了 对 其 原 理 的 分 析, 感 兴 趣 的 读 者 可 直 接 访
问http://java.sun.com 设 计 计 算 器 有 多 种 方 法, 从 结 构 上 看, 归 纳 起
 来, 大 致 有 三 种。
---- 1、 本 地 机

---- 在 本 机 上 输 入 参 数, 计 算 在 本 机 上 完 成, 结 果 由 本 机 显 示 给
 用 户。

---- 2、 本 地 机-TCP/IP- 远 程 机

---- 在 本 地 机 上 输 入 参 数, 本 地 机 将 参 数 通 过 网 络 送 给 远 程 机,
 远 程 机 启 动 一 个 进 程 计 算 出 结 果, 然 后 远 程 机 将 结 果 通 过 网 络
(Socket, HTTP 等 等) 送 给 本 地 机, 结 果 由 本 地 机 显 示 给 用 户。

---- 3、 本 地 机-RMI-TCP/IP-RMI- 远 程 机

---- 本 地 机 从 远 程 机 上 得 到 一 个 小 程 序(Applet) 用 作 数 据 输 入( 多
 项 式 系 数) 和 结 果 显 示, 在 本 地 机 上 输 入 的 数 据 将 作 为 调 用 远
 程 机 上 函 数 的 参 数, 该 远 程 函 数 计 算 出 结 果, 反 过 来, 将 该 结
果 作 为 调 用 本 地 机 上 对 象( 如 刚 才 那 个Applet) 的 函 数( 如 屏 幕 刷
新) 的 参 数 调 用 该 本 地 函 数, 就 这 样, 计 算 结 果 自 然 地 被 送 回 来
, 显 示 在 本 地 机 上。

---- 显 然, 第3 种 方 案 是 最 灵 活、 最 优 雅 的 网 络 计 算 模 式。 下 面 的
 程 序 正 是 基 于 这 种 模 式。 由 于 篇 幅 所 限, 程 序 没 有 过 多 考 虑 完
 备 性, 如 对Exception 只 作 了 简 单 的 处 理, 但 该 程 序 用 于 RMI 编 程 风
 格 讲 解, 并 不 碍 大 局。

---- ServerManager, ServerManagerListener 用 于 简 单 控 制RMIServer 的 启 动,
 停 止, 退 出。

---- RMIServer 设 计 成 一 个 简 单 的RMI 服 务 器, 其 中:

---- RMIServer(String sMAPServerName) 完 成 服 务 器 的 命 名, 在1099 口 上 作
 注 册 登 记 准 备。

---- startRMI() 的Naming.rebind("/"+sServerName,this) 将 启 动 该 服 务 器, 以
sServerName 的 值 为 名 称, 也 就 是"RMIServer," 启 动 后,RMIServer 开 始 在
1099 口 上 倾 听 来 自 网 络 的 呼 叫。

---- stopRMI() 的Naming.unbind(sServerName) 用 于 停 止 该 服 务 器。

---- calculateIT(double[] dA, ClientRemoteInterfacecrInterface) throws
RemoteException 是 供 客 户 端Java 虚 拟 机 作 远 程 调 用 的 函 数,dA 是 多 项
 式 系 数(a3,a2,a1,a0), 该 多 项 式 定 义 为

---- F(X)=a3*X3+a2*X2+a1X+a0

---- crInterface 是 客 户 端Java 虚 拟 机 远 程 调 用 服 务 器 端Java 虚 拟 机
时 作 为 参 数 送 过 来 的 代 表 客 户 端 的 远 程 接 口, 供 服 务 器 端 需 要
 时 反 过 来 对 客 户 端 作 远 程 调 用 时 使 用。

---- calculateIT 结 果 计 算 出 来 以 后, 服 务 器 端 很 轻 松 地 用

---- crInterface.drawIT(iXY);

---- 一 个 语 句 就 激 发 了 在 客 户 端 的drawIT(iXY) 函 数。 计 算 结 果iXY 作
 为 函 数 参 数 自 动 地 传 送 到 客 户 端。

---- 客 户 端Java 虚 拟 机 靠CalculatorDisplay 这 个Applet 激 发 服 务 器 端
Java 虚 拟 机 上 的calculateIT 函 数, 浏 览 器( 如HotJava) 从 服 务 器 上 获
 得CalculatorDisplay 以 后, 该Applet 的init() 函 数 里 有 两 条 关 键 的 语 句


srInterface = (ServerRemoteInterface)
Naming.lookup("//"+getCodeBase().getHost()+"/"+"RMIServer");
UnicastRemoteObject.exportObject(this);
---- 第 一 句 的 目 的 是 在 提 供 该Applet 的 服 务 器 上 寻 找 名 为
RMIServer 的RMI 远 程 对 象。 找 到 以 后, 用srInterface 接 口 代 表; 第 二 句
 是 所 谓 的 将 本 对 象 输 出 的 操 作, 这 样 才 可 以 将 本 对 象 的 远 程 接
 口 作 为 远 程 函 数 调 用 的 参 数 传 送 到 服 务 器 端。 当 需 要 调 用( 或
 启 动) 服 务 器 端 的calculateIT 函 数 时, 也 只 是 简 单 的 一 个 语 句
---- srInterface.calculateIT(dA,this);

---- Java 工 具 还 会 自 动 生 成CalculatorDisplay_Skel,CalculatorDisplay_Stub,
RMIServer_Skel, RMIServer_Stub 文 件, 在 此 可 暂 不 理 会。P 和 本 文 没 有 什
 么 关 系, 作 者 只 是 为 了 方 便, 用 它 来 把 简 单 信 息 显 示 到 屏 幕 上
。 至 此, 相 信 读 者 已 经 看 出RMI 的 功 能 和 简 明 性 了。

前 景
---- 虽 然 本 文 描 述 的 只 是 一 个 小 小 的 多 项 式 求 值, 轨 迹 输 出 例
子, 但 不 难 想 象, 计 算 对 象 可 以 是 高 阶 微 分 方 程, 高 阶 矩 阵 运 算
, 客 户 机 可 以 是 普 通 的PC 机, 服 务 器 可 以 是 超 级 计 算 机, 在 其 上
 可 进 行 诸 如 流 体 力 学 模 型 仿 真, 风 洞 模 拟 试 验, 实 时 图 像 处 理
, 气 象 分 析, 股 市 预 测, 人 工 智 能, 大 型 数 据 库 访 问 等 等。 而PC
机 用 于 调 节 参 数, 控 制 进 程, 观 测 结 果 等 等, 其 效 果 如 同 置 身 于
 超 级 计 算 机 上 直 接 运 行 程 序 一 样, 尽 管 它 实 际 上 离 你 十 万 八 千
 里。
---- 从 商 业 上 看, 超 级 计 算 机 可 以 向 更 多 的 用 户 提 供 商 业 服 务,
 例 如 收 费 向 远 程 用 户 提 供 模 拟 试 验, 而 普 通PC 用 户, 既 能 享 受
PC 的 廉 价 方 便, 又 有 可 能 享 受 到 原 来 不 可 想 象 的 超 级 计 算 的 威
 力, 因 为Java RMI 可 以 轻 松 自 如 地 将 超 级 计 算 延 伸 到 你 的 桌 面 上


---- 以 下 是 源 程 序。

package RMICalculator;

/** * This class was generated by a SmartGuide.* */
import java.rmi.*;
import java.rmi.server.*;
public class CalculatorDisplay extends java.applet.Applet
 implements java.awt.event.ActionListener,
RMICalculator.ClientRemoteInterface {
   private double[] dA = new double[4];
   private boolean isDraw = false;
   private java.awt.Button ivjbDraw = null;
   private java.awt.Label ivjlA0 = null;
   private java.awt.Label ivjlA1 = null;
   private java.awt.Label ivjlA2 = null;
   private java.awt.Label ivjlA3 = null;
   private java.awt.Label ivjlTitle = null;
   private java.awt.Panel ivjpCoefficients = null;
   private java.awt.TextField ivjtfA0 = null;
   private java.awt.TextField ivjtfA1 = null;
   private java.awt.TextField ivjtfA2 = null;
   private java.awt.TextField ivjtfA3 = null;
   private int[][] iXY;
   ServerRemoteInterface srInterface;

/** Method to handle events for the ActionListener interface.
 * @param e java.awt.event.ActionEvent */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
public void actionPerformed(java.awt.event.ActionEvent e) {
   // user code begin {1}
   // user code end
   if ((e.getSource() == getbDraw()) ) {
 conn0(e);
   }
   if ((e.getSource() == gettfA3()) ) {
 conn1(e);
   }
   if ((e.getSource() == gettfA2()) ) {
 conn2(e);
   }
   if ((e.getSource() == gettfA1()) ) {
 conn3(e);
   }
   if ((e.getSource() == gettfA0()) ) {
 conn4(e);
   }
   // user code begin {2}
   // user code end
}

/**conn0:(bDraw.action.actionPerformed
(java.awt.event.ActionEvent)--> CalculatorDisplay.start())
  * @param arg1 java.awt.event.ActionEvent*/
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void conn0(java.awt.event.ActionEvent arg1) {
   try {
 // user code begin {1}
 setisDraw(true);
 // user code end
 this.start();
 // user code begin {2}
 // user code end
   } catch (java.lang.Throwable ivjExc) {
 // user code begin {3}
 // user code end
 handleException(ivjExc);
   }
}

/**conn1:(tfA3.action.actionPerformed
(java.awt.event.ActionEvent) --> CalculatorDisplay.start())
 * @param arg1 java.awt.event.ActionEvent */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void conn1(java.awt.event.ActionEvent arg1) {
   try {
 // user code begin {1}
 setisDraw(true);
 // user code end
 this.start();
 // user code begin {2}
 // user code end
   } catch (java.lang.Throwable ivjExc) {
 // user code begin {3}
 // user code end
 handleException(ivjExc);
   }
}

/**conn2:(tfA2.action.actionPerformed(java.awt.
event.ActionEvent) --> CalculatorDisplay.start())
 * @param arg1 java.awt.event.ActionEvent */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void conn2(java.awt.event.ActionEvent arg1) {
   try {
 // user code begin {1}
 setisDraw(true);
 // user code end
 this.start();
 // user code begin {2}
 // user code end
   } catch (java.lang.Throwable ivjExc) {
 // user code begin {3}
 // user code end
 handleException(ivjExc);
   }
}

/**conn3:(tfA1.action.actionPerformed
(java.awt.event.ActionEvent) --> CalculatorDisplay.start())
 * @param arg1 java.awt.event.ActionEvent */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void conn3(java.awt.event.ActionEvent arg1) {
   try {
 // user code begin {1}
 setisDraw(true);
 // user code end
 this.start();
 // user code begin {2}
 // user code end
   } catch (java.lang.Throwable ivjExc) {
 // user code begin {3}
 // user code end
 handleException(ivjExc);
   }
}

/**conn4:(tfA0.action.actionPerformed
(java.awt.event.ActionEvent) --> CalculatorDisplay.start())
 * @param arg1 java.awt.event.ActionEvent */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void conn4(java.awt.event.ActionEvent arg1) {
   try {
 // user code begin {1}
 setisDraw(true);
 // user code end
 this.start();
 // user code begin {2}
 // user code end
   } catch (java.lang.Throwable ivjExc) {
 // user code begin {3}
 // user code end
 handleException(ivjExc);
   }
}

/** This method was created by a SmartGuide.
 * @param iX int
 * @param iY int
 * @exception java.rmi.RemoteException
The exception description. */
public void drawIT(int[][] iXY)
throws java.rmi.RemoteException {
   this.iXY=iXY;
   repaint();
   return;
}
/**Gets the applet information.   @return java.lang.String */
public String getAppletInfo() {
   return "RMICalculator.CalculatorDisplay
 created using VisualAge for Java.";
}

/**Return the bDraw property value.   @return java.awt.Button */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Button getbDraw() {
   if (ivjbDraw == null) {
 try {
    ivjbDraw = new java.awt.Button();
    ivjbDraw.setName("bDraw");
    ivjbDraw.setLabel("Draw");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjbDraw;
}

/**Return the lA0 property value.  @return java.awt.Label */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Label getlA0() {
   if (ivjlA0 == null) {
 try {
    ivjlA0 = new java.awt.Label();
    ivjlA0.setName("lA0");
    ivjlA0.setAlignment(java.awt.Label.RIGHT);
    ivjlA0.setText("a0=");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
handleException(ivjExc);
 }
   };
   return ivjlA0;
}

/**Return the lA1 property value.  @return java.awt.Label */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Label getlA1() {
   if (ivjlA1 == null) {
 try {
    ivjlA1 = new java.awt.Label();
    ivjlA1.setName("lA1");
    ivjlA1.setAlignment(java.awt.Label.RIGHT);
    ivjlA1.setText("a1=");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjlA1;
}

/**Return the lA2 property value.  @return java.awt.Label */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Label getlA2() {
   if (ivjlA2 == null) {
 try {
    ivjlA2 = new java.awt.Label();
    ivjlA2.setName("lA2");
    ivjlA2.setAlignment(java.awt.Label.RIGHT);
    ivjlA2.setText("a2=");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjlA2;
}

/**Return the lA3 property value.  @return java.awt.Label */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Label getlA3() {
   if (ivjlA3 == null) {
 try {
    ivjlA3 = new java.awt.Label();
    ivjlA3.setName("lA3");
    ivjlA3.setAlignment(java.awt.Label.RIGHT);
    ivjlA3.setText("a3=");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjlA3;
}

/**Return the lTitle property value.  @return java.awt.Label */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Label getlTitle() {
   if (ivjlTitle == null) {
 try {
    ivjlTitle = new java.awt.Label();
    ivjlTitle.setName("lTitle");
    ivjlTitle.setText("Graph of the polynomial");
    ivjlTitle.setBackground(java.awt.Color.blue);
    ivjlTitle.setForeground(java.awt.Color.white);
    ivjlTitle.setAlignment(java.awt.Label.CENTER);
    ivjlTitle.setFont(new java.awt.Font("dialog", 1, 16));
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjlTitle;
}

/**Return the pCoefficients property value.  @return java.awt.Panel */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.Panel getpCoefficients() {
   if (ivjpCoefficients == null) {
 try {
    ivjpCoefficients = new java.awt.Panel();
    ivjpCoefficients.setName("pCoefficients");
    ivjpCoefficients.setLayout(new java.awt.GridLayout());
    ivjpCoefficients.setBackground(java.awt.Color.white);
    ivjpCoefficients.add(getlA3(), getlA3().getName());
    ivjpCoefficients.add(gettfA3(), gettfA3().getName());
    ivjpCoefficients.add(getlA2(), getlA2().getName());
    ivjpCoefficients.add(gettfA2(), gettfA2().getName());
    ivjpCoefficients.add(getlA1(), getlA1().getName());
    ivjpCoefficients.add(gettfA1(), gettfA1().getName());
    ivjpCoefficients.add(getlA0(), getlA0().getName());
    ivjpCoefficients.add(gettfA0(), gettfA0().getName());
    ivjpCoefficients.add(getbDraw(), getbDraw().getName());
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjpCoefficients;
}

/**Return the tfA0 property value.  @return java.awt.TextField */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.TextField gettfA0() {
   if (ivjtfA0 == null) {
 try {
    ivjtfA0 = new java.awt.TextField();
    ivjtfA0.setName("tfA0");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjtfA0;
}

/**Return the tfA1 property value.  @return java.awt.TextField */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.TextField gettfA1() {
   if (ivjtfA1 == null) {
 try {
    ivjtfA1 = new java.awt.TextField();
    ivjtfA1.setName("tfA1");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjtfA1;
}

/**Return the tfA2 property value.   @return java.awt.TextField */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.TextField gettfA2() {
   if (ivjtfA2 == null) {
 try {
    ivjtfA2 = new java.awt.TextField();
    ivjtfA2.setName("tfA2");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjtfA2;
}

/**Return the tfA3 property value.   @return java.awt.TextField */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private java.awt.TextField gettfA3() {
   if (ivjtfA3 == null) {
 try {
    ivjtfA3 = new java.awt.TextField();
    ivjtfA3.setName("tfA3");
    // user code begin {1}
    // user code end
 } catch (java.lang.Throwable ivjExc) {
    // user code begin {2}
    // user code end
    handleException(ivjExc);
 }
   };
   return ivjtfA3;
}

/**Called whenever the part throws an exception.
 @param exception java.lang.Throwable */
private void handleException(Throwable exception) {
  /* Uncomment the following lines to print uncaught exceptions to stdout */
  // System.out.println("--------- UNCAUGHT EXCEPTION ---------");
  // exception.printStackTrace(System.out);
}

/**Handle the Applet init method. */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
public void init() {
   super.init();
   try {
 setName("CalculatorDisplay");
 setLayout(new java.awt.BorderLayout());
 setSize(400, 300);
 this.add("North", getlTitle());
 this.add("South", getpCoefficients());
 initConnections();
 // user code begin {1}
 try {
    srInterface=(ServerRemoteInterface) Naming.lookup("//"+getCodeBase()
.getHost()+"/"+"RMIServer");
    UnicastRemoteObject.exportObject(this);}
 catch (RemoteException rE) {
    new P(rE.getMessage());}
 // user code end
   } catch (java.lang.Throwable ivjExc) {
 // user code begin {2}
 // user code end
 handleException(ivjExc);
   }
}

/**Initializes connections */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void initConnections() {
   // user code begin {1}
   // user code end
   getbDraw().addActionListener(this);
   gettfA3().addActionListener(this);
   gettfA2().addActionListener(this);
   gettfA1().addActionListener(this);
   gettfA0().addActionListener(this);
}

/**main entrypoint - starts the part when it is run as an application
 * @param args java.lang.String[] */
public static void main(java.lang.String[] args) {
   try {
 java.awt.Frame frame;
 try {
    Class aFrameClass = Class.forName("uvm.abt.edit.TestFrame");
    frame = (java.awt.Frame)aFrameClass.newInstance();
 } catch (java.lang.Throwable ivjExc) {
    frame = new java.awt.Frame();
 }
 RMICalculator.CalculatorDisplay aCalculatorDisplay
 = new RMICalculator.CalculatorDisplay();
 frame.add("Center", aCalculatorDisplay);
 frame.setSize(aCalculatorDisplay.getSize());
 aCalculatorDisplay.init();
 aCalculatorDisplay.start();
 frame.setVisible(true);
 aCalculatorDisplay.destroy();
   } catch (Throwable exception) {
System.err.println("Exception occurred in main()
of java.applet.Applet");
   }
}

/**This method was created by a SmartGuide.
 * @param g Graphics */
public void paint(java.awt.Graphics g ) {
   if(!isDraw) return;
   g.drawLine(0,200,400,200);//axis X
   g.drawLine(5,0,5,205);//axis Y
   for(int i=0; i < iXY.length; i++) g.fillRect(iXY[i][0],iXY[i][1],3,3);
   return;
}
/**This method was created by a SmartGuide.
 * @param isDraw boolean */
public void setisDraw(boolean isDraw ) {
   this.isDraw=isDraw;
   return;
}
/**This method was created by a SmartGuide. */
public void start() {
   if(!isDraw) return;
   try{
 String s3=gettfA3().getText();
 String s2=gettfA2().getText();
 String s1=gettfA1().getText();
 String s0=gettfA0().getText();
 dA[3]= new Double(s3.length()==0 ? "0":s3).doubleValue();
 dA[2]= new Double(s2.length()==0 ? "0":s2).doubleValue();
 dA[1]= new Double(s1.length()==0 ? "0":s1).doubleValue();
 dA[0]= new Double(s0.length()==0 ? "0":s0).doubleValue();}
   catch (NumberFormatException nfE) {
 new P("DataDisplay:start():"+nfE.getMessage());
 return;}
   try{
 srInterface.calculateIT(dA,this);}
   catch(RemoteException rE) {
 new P(rE.getMessage());}
   return;
}
}

package RMICalculator;

import java.rmi.*;

public interface ClientRemoteInterface extends Remote
{

/**This method was created by a SmartGuide.
 * @param iX int
 * @param iY int
 * @exception java.rmi.RemoteException The exception description.
 */
public void drawIT(int[][] iXY ) throws RemoteException;
}

package RMICalculator;

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;

public class RMIServer extends UnicastRemoteObject
 implements ServerRemoteInterface
{
   String sServerName;
   int iSamples =40;

  public RMIServer(String sServerName) throws RemoteException
  {
   super();
   this.sServerName = sServerName;
   try {
 LocateRegistry.createRegistry(1099);}
   catch (RemoteException rE) {
 new P(rE.getMessage());}

  }
/**This method was created by a SmartGuide.
 * @return
 * @param sA java.lang.String[]
 * @param crInterface ClientRemoteInterface
 * @exception java.rmi.RemoteException The
exception description. */
public void calculateIT(double[] dA, ClientRemote
Interface crInterface) throws RemoteException {
   int[][] iXY = new int[iSamples][2];
   for(int i=0; i < iXY.length; i++){
 double dX=new Integer(i).doubleValue();
 double dF=0;
 for(int j=dA.length;j>0;j--) dF=dX*dF+dA[j-1];
 iXY[i][0]=i;
 iXY[i][1]= new Double(dF).intValue();}
   for(int i=0; i < iXY.length; i++){
 iXY[i][0]=10*iXY[i][0]+5;
 iXY[i][1]=-iXY[i][1]+200;}//coordinates
transformation
   crInterface.drawIT(iXY);
   return;
}
  public void startRMI()
  {
 try {
 Naming.rebind("/"+sServerName, this);
 new P("RMIServer starts.");}
 catch (Exception e) {
    new P(e.getMessage());}
  }
  public void stopRMI()
  {
 try {
 Naming.unbind(sServerName);
 new P("RMIServer stops.");}
 catch (Exception e) {
    new P(e.getMessage());}
  }
}

package RMICalculator;

import java.rmi.*;
public interface ServerRemoteInterface extends Remote
{
/** This method was created by a SmartGuide.
 * @param aA double[]
 * @param crInterface RMICalculator.ClientRemoteInterface
 * @exception java.rmi.RemoteException The exception description.
 */
public void calculateIT(double[] dA,
 ClientRemoteInterface crInterface) throws RemoteException;
}

package RMICalculator;
import java.awt.*;
import java.rmi.*;

public class ServerManager extends Frame
{
  Button bStartRMI,bStopRMI,bQuit;
  RMIServer rmiServer;

public ServerManager()
{
   bStartRMI = new Button("Start RMI server");
   bStopRMI = new Button("Stop RMI server");
   bStopRMI.setEnabled(false);
   bQuit = new Button("Quit");

   setLayout(new FlowLayout());
   add(bStartRMI);
   add(bStopRMI);
   add(bQuit);

   ServerManagerListener smL = new ServerManagerListener(this);
   bStartRMI.addMouseListener(smL);
   bStopRMI.addMouseListener(smL);
   bQuit.addMouseListener(smL);

   setTitle("RMI Server Manager");
   pack();
   show();

   try {
rmiServer = new RMIServer("RMIServer"); }
   catch (Exception e) {
 new P(e.getMessage());}
}
public static void main(String[] args)
{
   System.setSecurityManager(new RMISecurityManager());
   new ServerManager();
}
}

package RMICalculator;
import java.awt.event.*;

public class ServerManagerListener extends MouseAdapter
{
  ServerManager sm;

public ServerManagerListener(ServerManager sm)
{
   this.sm = sm;
}
public void mouseClicked(MouseEvent mE)
{
   if (mE.getSource() == sm.bStartRMI) {
sm.bStartRMI.setEnabled(false);
sm.bStopRMI.setEnabled(true);
sm.rmiServer.startRMI(); }
   else if (mE.getSource() == sm.bStopRMI ) {
sm.bStopRMI.setEnabled(false);
sm.bStartRMI.setEnabled(true);
sm.rmiServer.stopRMI(); }
   else if (mE.getSource() == sm.bQuit ) {
sm.dispose();
System.exit(0); }
}
}

package RMICalculator;
public class P
{
public P(String[][] s)
{
   for(int i=0; i < s.length; i++)  {
for(int j=0; j< s[0].length; j++) {
 System.out.println(s[i][j]); }}
}
public P(String[] s)
{
   for(int i=0; i< s.length; i++) System.out.println(s[i]);
}
public P(String s)
{
   System.out.println(s);
}
}

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


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

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