(选自:java区,作者:038 (zzj038),时间:2000年08月28日)
远程方法调用
远程方法调用(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
<------------ 完 ------------->
参考:
《java 编程思想》
《轻松掌握jbuilder2》
《sun jdk文档》
--
我思,故我在
※ 来源:.网易虚拟社区北京站 http://bj.163.com.[from: 202.104.29.154]
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器