当前位置: 首页 > 图文教程 > 网络编程 > JSP > 关于远程方法调用(RMI)的实现

JSP
jsp计数器制作
用jsp编写文件上载
基于JSP的动态网站开发技术
JSP由浅入深(3)—— 通过表达式增加动态内容
JSP由浅入深(5)—— Scriptlets和HTML的混合
JSP由浅入深(1)—— 熟悉JSP服务器
JSP由浅入深(12)—— 表单编辑
JSP由浅入深(11)—— 标记库
JSP由浅入深(10)—— Beans and Forms处理
JSP由浅入深(9)—— JSP Sessions
JSP由浅入深(8)—— JSP Tags
JSP由浅入深(6)—— JSP声明
JSP由浅入深(4)—— Scriptlets
JSP由浅入深(2)—— 第一个JSP
JSP由浅入深(7)—— JSP Directives
JSP中的字符替换函数 str_replace() 实现!
把一张图片变形扭曲成各种不同的长宽
用JSP编写通用信息发布程序
Java Servlet及Cookie的使用
Apache+Servlet+Jsp环境设置(上)

JSP 中的 关于远程方法调用(RMI)的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-02   浏览: 73 ::
收藏到网摘: n/a

远程方法调用

远程方法调用(Remote Method Invocation ,RMI)使用户能访问在另一
主机上的Java对象,并远程调用其方法。程序的对象是客户,而远程对象是服
务器。远程对象也可以是另一个远程服务对象的客户。通过使用持续性(串行
化和解串行化),本地对象和原始类型值可以作为参数传递给远程对象。这种
方式允许Java程序可以利用分布式计算将工作量分散到多个Java虚拟机上。

工作原理
RMI系统结构,在客户端和服务器端都有几层结构。
--------- ----------
| 客户 | | 服务器|
---------- ----------
| |
------------- ----------
| 占位程序 | | 骨干网 |
-------------- -----------
| |
------------------------------------
| 远 程 引 用 层 |
------------------------------------
| |
------------------------------------
| 传 输 层 |
------------------------------------

方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference
Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传
输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。
占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。
远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个
服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的
远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返
回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上
经传输层和远程调用层返回。最后,占位程序获得返回值。

要完成以上步骤需要有以下几个步骤:
1、生成一个远程接口
2、实现远程对象(服务器端程序)
3、生成占位程序和骨干网(服务器端程序)
4、编写服务器程序
5、编写客户程序
6、注册远程对象
7、启动远程对象

具体实现如下:
1、生成一个远程接口
package c15.ptime;
import java.rmi.*;

public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}

2、实现远程对象(服务器端程序)
package c15.ptime;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public class PerfectTime
extends UnicastRemoteObject
implements PerfectTimeI {
public long getPerfectTime()
throws RemoteException {
return System.currentTimeMillis();
}

public PerfectTime() throws RemoteException {
super();
}

public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTime pt = new PerfectTime();
Naming.rebind(
"//zhouty:2005/PerfectTime" , pt);
System.out.println("Ready to do time");
} catch(Exception e) {
e.printStackTrace();
}
}
}

4、编译远程对象(服务器端程序)
javac -classpath . -d . PerfectTime.java

5、生成根和干(占位程序和骨干程序)
rmic -classpath . -d . c15.ptime.PerfectTime

6、注册远程对象
start rmiregistry 2005

7、启动服务器端程序
java -Djava.rmi.server.codebase=file:///d:/TestRMI/ c15.ptime.Per
fectTime

8、编写客户端程序
package c15.ptime;
import java.rmi.*;
import java.rmi.registry.*;

public class DisplayPerfectTime {
public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTimeI t =
(PerfectTimeI)Naming.lookup(
"192.168.0.171:2005/PerfectTime");
for(int i = 0 ; i < 10; i++)
System.out.println("Perfect time =" +
t.getPerfectTime());
} catch(Exception e) {
e.printStackTrace();
}
}
}

9、编译客端程序
javac -classpath . -d . DisplayPerfectTime.java

10、修改JVM的配置文件 (客户机和服务器的都需要经过修改)
%JRE_HOME%\policytool.exe

11、启动客户程序
java -classpath . c15.ptime.DisplayPerfectTime

12、返回结果

Perfect time =967274884390
Perfect time =967274884450
Perfect time =967274884450
Perfect time =967274884450
Perfect time =967274884500
Perfect time =967274884500
Perfect time =967274884560
Perfect time =967274884610
Perfect time =967274884610
Perfect time =967274884610