荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店