说明:本文摘自http://java.e800.com.cn/articles/2008/630/1214799775734_2.html
RMI一步一步来
2008-06-30 12:22:55.0
推荐:0 收藏:0 评论:0 来源:e800Java频道
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序
一个正常工作的RMI系统由下面几个部分组成:
远程服务的接口定义
远程服务接口的具体实现
桩(Stub)和框架(Skeleton)文件
一个运行远程服务的服务器
一个RMI命名服务,它允许客户端去发现这个远程服务
类文件的提供者(一个HTTP或者FTP服务器)
一个需要这个远程服务的客户端程序
下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。
如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:
1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
3、 从接口实现类中生成桩(Stub)和框架(Skeleton)类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统
1、 接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
//Calculator.java
//define the interface
import java.rmi.Remote;
public interface Calculator extends Remote
{
public long add(long a, long b)
throws java.rmi.RemoteException;
public long sub(long a, long b)
throws java.rmi.RemoteException;
public long mul(long a, long b)
throws java.rmi.RemoteException;
public long div(long a, long b)
throws java.rmi.RemoteException;
}
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
建立这个文件,把它存放在刚才的目录下,并且编译。
>javac Calculator.java
2、 接口的具体实现
下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件:
//CalculatorImpl.java
//Implementation
import java.rmi.server.UnicastRemoteObject
public class CalculatorImpl extends UnicastRemoteObject implements Calculator
{
// 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常
public CalculatorImpl()
throws java.rmi.RemoteException {
super();
}
public long add(long a, long b)
throws java.rmi.RemoteException {
return a + b;
}
public long sub(long a, long b)
throws java.rmi.RemoteException {
return a - b;
}
public long mul(long a, long b)
throws java.rmi.RemoteException {
return a * b;
}
public long div(long a, long b)
throws java.rmi.RemoteException {
return a / b;
}
}
同样的,把这个文件保存在你的目录里然后编译他。
这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中,我们是直接的从UnicastRemoteObject这
个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方
法去联接到RMI。
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个
RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和
远程对象的初始化。
3、 桩(Stubs)和框架(Skeletons)
下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
>rmic CalculatorImpl
在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个Calculator_stub.class文件,如果你是使用的Java2SDK,那么你还可以发现Calculator_Skel.class文件。
4、 主机服务器
远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。
//CalculatorServer.java
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
Naming.rebind("rmi://localhost:1099/CalculatorService", c);
} catch (Exception e) {
System.out.println("Trouble: " + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}
}
建立这个服务器程序,然后保存到你的目录下,并且编译它。
5、 客户端
客户端源代码如下:
//CalculatorClient.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
public class CalculatorClient {
public static void main(String[] args) {
try {
Calculator c = (Calculator)
Naming.lookup(
"rmi://localhost
/CalculatorService");
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
}
catch (MalformedURLException murle) {
System.out.println();
System.out.println(
"MalformedURLException");
System.out.println(murle);
}
catch (RemoteException re) {
System.out.println();
System.out.println(
"RemoteException");
System.out.println(re);
}
catch (NotBoundException nbe) {
System.out.println();
System.out.println(
"NotBoundException");
System.out.println(nbe);
}
catch (
java.lang.ArithmeticException
ae) {
System.out.println();
System.out.println(
"java.lang.ArithmeticException");
System.out.println(ae);
}
}
}
保存这个客户端程序到你的目录下(注意这个目录是一开始建立那个,所有的我们的文件都在那个目录下),并且编译他。
6、 运行RMI系统
现在我们建立了所有运行这个简单RMI系统所需的文件,现在我们终于可以运行这个RMI系统啦!来享受吧。
我们是在命令控制台下运行这个系统的,你必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。
首先运行注册程序RMIRegistry,你必须在包含你刚写的类的那么目录下运行这个注册程序。
>rmiregistry
好,这个命令成功的话,注册程序已经开始运行了,不要管他,现在切换到另外一个控制台,在第二个控制台里,我们运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子
grant {
permission java.security.AllPermission "", "";
};
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。
现在为了运行服务端,你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。
> java -Djava.security.policy=policy.txt CalculatorServer
这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台,启动我们的客户端。
为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端
prompt> java -Djava.security.policy=policy.txt CalculatorClient
如果所有的这些都成功运行,你应该看到下面的输出:
1
9
18
3
如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。
分享到:
相关推荐
本篇文章将深入探讨“RMI一步一步学习”这个主题,通过分析给定的文件列表,我们将了解RMI的基本原理和实现步骤。 首先,我们看到`Calculator`类,这是RMI中的接口,它定义了可以在远程服务器上执行的方法。例如,...
这一步通常通过`java.rmi.Naming.lookup()`来实现。 6. **序列化(Serialization)**:由于Java RMI涉及到跨JVM的调用,所以参数和返回值必须是可序列化的。这意味着它们要么是`java.io.Serializable`的直接实现,...
Java Remote Method Invocation(Java RMI)是Java编程语言中用于在网络间进行远程对象调用的技术。它是Java平台的标准...理解并掌握Java RMI的基本原理和实践,对于Java开发者来说,是迈进高级应用开发的重要一步。
3. **编译远程接口与实现**:编译`Calculator.java`和`CalculatorImpl.java`,这一步会生成实现类的字节码文件。 4. **生成存根和骨架**:使用`rmic`工具编译`CalculatorImpl`类,该工具会生成两个辅助类`...
1. 服务器端创建远程对象并绑定到RMI注册表,这一步通常在服务器启动时完成。 2. 客户端通过JNDI(Java Naming and Directory Interface)查找RMI注册表,获取远程对象的引用。 3. 客户端使用获得的引用调用远程方法...
分布式RMI(Remote Method Invocation)远程调用是一种在分布式系统中实现对象间通信的技术,它允许...然而,理解Remoting仍然是了解.NET分布式系统设计的重要一步,特别是对于维护旧项目或理解底层原理的开发者来说。
Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。至此,RMI与Zookeeper结合可以构建更健壮、高效的远程调用框架...
玩家A的每一步操作都会通过RMI发送到玩家B的客户端,确保游戏的实时性。 5. **并发处理**:由于涉及到多个玩家同时操作,游戏可能需要处理并发问题。JAVA提供了线程(Thread)和锁(Lock)机制,以确保在多线程环境...
信息收集是渗透测试中极其重要的一步。 10. 文档中可能存在的OCR识别错误: 由于OCR扫描技术的局限性,文档中可能出现文字识别错误或漏识别。在理解和运用文档内容时,应保持警惕,并尽可能根据上下文推断出正确...
最后一步是在服务端启动 RMI 服务器。这里创建一个 `CalculatorServer` 类,该类通过 `java.rmi.Naming.rebind` 方法将服务绑定到一个特定的 URL 上。 ```java import java.rmi.Naming; import java.rmi....
在“一步一步学Remoting”的压缩包中,很可能包含了一系列的示例代码,用于演示如何创建、配置和使用远程对象。这些示例可能涵盖了基本的Remoting调用、自定义通道实现、对象生存期管理、安全性和性能优化等方面。 ...
- **Connector**:提供客户端与MBeanServer之间的通信,例如RMI、JMXMP等。 在HelloWorld实例中,Hello类就是一个简单的MBean,提供了获取和设置名字的功能。MBeanServer可以将Hello对象注册进去,然后通过JMX...
这一步会生成相应的.class字节码文件,是Java程序运行的基础。 2. **启动RMI注册表**:运行`rmiregistry`命令启动RMI注册表。RMI注册表是一个服务,用于存储远程对象的引用,使得其他客户端可以查找并调用这些对象的...
传统分布式应用依赖于像DCOM、CORBA、RMI这样的中间件,但它们的紧耦合性质限制了跨平台的互操作性。Web服务的出现,主要是为了解决互联网上的松散耦合问题,允许服务提供者和消费者之间的互操作,即使他们使用不同...
这一步是让客户端能找到服务端的关键步骤。 ```java import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; Registry registry = LocateRegistry.createRegistry(port); // port是服务器...
- **配置MyEclipse首选项**:在Eclipse中,通过“窗口” -> “首选项”来设置MyEclipse的相关配置,以使其能够识别和管理应用服务器。 - **配置WebLogic**:在MyEclipse中添加WebLogic Server,指定BEA根目录、...
Java 反射机制是一种高级技术,它允许程序在运行时获得关于类的信息并动态操作这些类。这种能力对于需要在运行时根据字符串形式...对框架开发者来说,深入理解并熟练使用 Java 反射技术是提升框架应用水平的重要一步。