一、编写Java RMI分布式应用程序的步骤主要包括以下几步:
(1) 将远程类的功能定义为Java接口。在Java中,远程对象是实现远程接口的类的实例。在远程接口中声明每个要远程调用的方法。远程接口具有如下特点:1) 远程接口必须声明为public。如果不这样,则除非客户端与远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时会得到错误结果。2) 远程对象扩展java.rmi.Remote接口。3) 除了所有应用程序特定的例外之外,每个方法还必须抛出java.rmi.RemoteException例外。4) 任何作为参数或返回值传送的远程对象的数据类型必须声明为远程接口类型,而不是实现类。
(2) 编写和实现服务器类。该类是实现(1)中定义的远程接口。所以在该类中至少要声明实现一个远程接口,并且必须具有构造方法。在该类中还要实现远程接口中所声明的各个远程方法。
(3) 编写使用远程服务的客户机程序。在该类中使用java.rmi.Naming中的lookup()方法获得对远程对象的引用,依据需要调用该引用的远程方法,其调用方式和对本地对象方法的调用相同。
实现了服务器和客户机的程序后,就是编译和运行该RMI系统。其步骤有:
(1) 使用javac编译远程接口类,远程接口实现类和客户机程序。
(2) 使用rmic编译器生成实现类的stub和skeleton。
(3) 启动RMI注册服务程序rmiregistry。
(4) 启动服务器端程序。
(5) 启动客户机程序。
二、实例代码:
//服务端接口程序
//IServer.java
package test;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IServer extends Remote {
long getTime() throws RemoteException;
}
//服务端实现程序
//ServerImpl.java
package test;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ServerImpl extends UnicastRemoteObject implements IServer {
public ServerImpl() throws RemoteException {
super();
}
public long getTime() throws RemoteException {
return System.currentTimeMillis();
}
public static void main(String[] args) {
/* 创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分,适用于RMI唯一一个是RMISecurityManager. */
System.setSecurityManager(new RMISecurityManager());
try {
/* 创建远程对象的一个或多个实例,下面是PerfectTime对象 */
ServerImpl server = new ServerImpl();
/* 向RMI远程对象注册表注册至少一个远程对象。一个远程对象拥有的方法即可生成指向其他远程对象的句柄,这样,客户到注册表里访问一次,得到第一个远程对象即可. */
Naming.rebind("RMIServer", server);
System.out.println("Ready to getTime");
} catch (Exception e) {
e.printStackTrace();
}
}
}
//客户端调用程序
//TestClient.java
package test;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
public class TestClient {
public TestClient() {
super();
}
public static void main(String[] args) {
System.setSecurityManager(new RMISecurityManager());
try {
IServer server = (IServer) Naming.lookup("RMIServer");
for (int i = 0; i < 10; i++) {
System.out.println("PerfectTime:" + server.getTime());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、运行示例:
1.创建Stub和Skeleton:
rmic -d . test.ServerImpl
若运行成功,则会在test目录下生成两个类ServerImpl_Stub.class和ServerImpl_Skel.class
2.启动RMI注册(Registry)程序:
start rmiregistry
3.启动服务器程序:
java test.ServerImpl
4.运行客户端调用程序:
java test.TestClient
四、一些常见的异常及处理办法:
1.
problem: You get a "class not found" error when running rmic
solution: Add the current directory to your classpath.
2.
problem: You get the following error when running the client
Exception occured: java.rmi.UnmarshalException: Return value class not found; nested exception is:
java.lang.ClassNotFoundException: myRMIImpl_Stub
solution: The file myRMIImpl_Stub.class must be deployed with your client application (that is, you must place it somewhere in the classpath of the client machine; If you were using an applet as a client, you would place it in the directory specified in the CODEBASE parameter to achieve the same effect).
3.
problem: You get the following error when running the client
C:\test3>java myRMIClient 127.0.0.1
Exception occured: java.security.AccessControlException: access denied (java.net
.SocketPermission 127.0.0.1:1099 connect,resolve)
or the following when running the server
C:\test3>java myRMIServer
Exception occurred: java.security.AccessControlException: access denied (java.ne
t.SocketPermission 127.0.0.1:1099 connect,resolve)
solution: I experienced this problem under Java2 with the default security policy in place. You'll need to modify your security policy to allow these activities to take place. A full writeup on this is available at The Sun RMI tutorial page.
In summary, you'll need to do the following:
(1)Create a new security policy file. See your JDK docs or the links referenced from the Sun RMI tutorial for more information on this.
(2)When you run the client or the server, pass the location of your new security policy file in as an argument. This allows you to run under a new policy without having to modify your system policy files. Here is a .policy file that grants all permissions to everybody. DO NOT install this policy file in a production system. However, you can use it in trivial testing. You can then run the server with the command line
java -Djava.security.policy=c:\test3\wideopen.policy myRMIServer
or the client with
java -Djava.security.policy=c:\test3\wideopen.policy myRMIClient 127.0.0.1
Of course, you'd replace c:\test3\wideopen.policy with the full path to your own properties file.
Here is another policy file that includes only the permissions necessary to run this app.
参考资料:
http://www.ccs.neu.edu/home/kenb/com3337/rmi_tut.html
http://www.huihoo.com/java/rmi/
http://patriot.net/~tvalesky/easyrmi.html
http://www.javajia.com/article.php?id=389
http://www.delfan.com/language/java/apps/rmi.html
http://www.itonline.gd.cn/ittech/list.asp?id=117
分享到:
相关推荐
总结来说,Java RMI简单示例主要展示了以下知识点: 1. **远程接口**:定义了远程方法的签名,需要继承`Remote`接口。 2. **远程对象**:服务器端的类实现远程接口,并继承`UnicastRemoteObject`,以支持远程调用。 ...
这个“javaRMI简单示例”是针对初学者,尤其是刚毕业的学生设计的一个教学资源,旨在帮助他们快速理解RMI的基本原理和实现步骤。 RMI的核心思想是使对象能够在网络中的不同计算机上进行调用,就像它们在同一台机器...
现在我们来深入解析这个“RPC-RMI实现加法的简单示例程序”。 首先,我们需要定义一个接口,这个接口将包含我们要实现的加法操作。在Java中,这个接口通常会用`@Remote`注解标记,表明它包含的都是远程方法。例如:...
一个简单的RMI示例步骤如下: 1. 定义远程接口,如: ```java import java.rmi.Remote; import java.rmi.RemoteException; public interface MyRemoteInterface extends Remote { String doSomething(String ...
本篇文章将通过一个简单的RMI示例,帮助你理解和掌握如何使用RMI进行分布式编程。 首先,理解RMI的基本概念是非常重要的。RMI允许Java对象作为远程对象暴露给其他Java应用程序,这些应用程序可以像调用本地对象一样...
### Java分布式之RMI简介及实例 #### RMI概述 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算框架,它允许开发者创建可以在网络上跨多台计算机运行的对象。RMI的目标是使得...
在“RMI简单示例 - Java Remote Methods Invocation”中,我们将探索如何利用RMI创建一个简单的客户端-服务器架构。在这个例子中,我们有一个服务端,它暴露了一个远程接口,以及一个客户端,该客户端能够调用服务端...
JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...
这个项目可能演示了如何在VC++环境中设置和使用RMI,例如创建一个简单的服务器,暴露一个远程方法,以及一个客户端来调用这个方法。 要深入学习和应用这些知识点,你需要对C++编程、面向对象设计、网络通信和可能的...
这个"JAVA RMI简单例子"旨在帮助我们深入理解RMI的基本原理和实现步骤。 RMI的核心概念包括远程接口、远程对象和RMIC编译器。首先,我们需要定义一个远程接口,该接口声明了可以在远程服务器上执行的方法。这些方法...
根据提供的文件信息,本文将详细解释RMI(远程方法调用)的概念、工作原理以及一个简单的RMI示例。RMI是一种Java技术,允许在不同的Java虚拟机(JVM)之间进行远程过程调用。 ### RMI简介 RMI是Java平台提供的一种...
下面我们将深入探讨RMI的基本概念、工作原理以及孙维琴示例的相关知识。 一、RMI基本概念 1. 远程接口(Remote Interface):定义了远程对象需要实现的方法。这些接口必须继承自java.rmi.Remote接口,声明的每个...
这个简单的RMI会议服务示例展示了如何利用Java RMI来实现分布式系统中的协作功能。通过RMI,不同客户端可以访问并修改共享的会议议程,增强了系统的可扩展性和协作性。在实际项目中,可以根据需求进一步优化设计,...
#### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种用于实现分布式应用的技术。它允许对象在不同的JVM之间通过网络相互调用对方的方法,就像调用本地对象一样。通过RMI,...
提供的压缩包文件"tijiao"可能包含了上述代码示例的实现,你可以解压后在不同机器上运行以体验RMI的工作流程。请注意,运行RMI应用需要确保JRE环境已安装,并且防火墙设置允许1099端口的通信。这个简单的实例展示了...
要运行这个RMI示例,首先确保JDK已经安装并且JVM支持RMI,然后按照以下步骤操作: 1. 编译所有源代码,生成对应的class文件。 2. 在服务器端启动RMI注册表(命令行输入`rmiregistry`或`java -jar rmiregistry.jar`...
RMI(Remote Method Invocation,远程方法调用)是Java平台上的一个重要特性,它允许Java对象在不同的JVM之间进行通信,实现分布式计算。...通过提供的简单示例,你已经可以开始探索和实践RMI技术了。
学习这个简单的RMI示例,可以帮助你了解如何在Java中设置和使用RMI,包括创建远程接口,实现远程对象,注册到RMI注册表,以及在客户端进行远程方法调用。这将为你构建更复杂的分布式系统打下基础。
这个简单的RMI示例展示了如何创建远程接口、实现远程对象、注册服务器和创建客户端。在实际应用中,RMI可以被用来构建更复杂的分布式系统,例如分布式数据库、分布式计算框架等。理解并掌握RMI是成为熟练Java开发...
### RMI最简单的一个实例解析 #### 一、RMI简介与应用场景 远程方法调用 (RMI) 是 Java 平台...以上就是RMI最简单的一个实例的具体实现步骤及分析。通过这个示例,我们可以了解到如何构建基于RMI的分布式应用系统。