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)。 使用如下命令运行客户端
> java -Djava.security.policy=policy.txt CalculatorClient
如果所有的这些都成功运行,你应该看到下面的输出:
1
9
18
3
如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。
分享到:
相关推荐
总之,这个"RMI.rar_Java会议室_rmi _会议室"项目是一个很好的学习和实践RMI技术的例子,它涵盖了RMI的基本原理和应用,同时也涉及到了分布式系统中的并发控制、安全性等高级话题。对于深入理解和掌握Java的分布式...
在Java编程领域,远程方法调用(Remote Method Invocation,RMI)是一种机制,允许...在实际项目中,"rmi-zookeeper-master"这样的压缩包可能包含了实现这一框架的源代码、配置文件和其他相关资源,供开发者参考学习。
总结来说,"JAVA 局域网对战五子棋游戏(基于RMI)"项目涵盖了JAVA编程、GUI设计、网络编程、并发处理、错误处理等多个方面的知识点,是学习和实践JAVA技术的好实例。通过这个项目,开发者可以深入理解JAVA RMI的...
在“一步一步学Remoting”的压缩包中,很可能包含了一系列的示例代码,用于演示如何创建、配置和使用远程对象。这些示例可能涵盖了基本的Remoting调用、自定义通道实现、对象生存期管理、安全性和性能优化等方面。 ...
例如,学习如何利用Java进行分布式系统开发,理解RMI(远程方法调用)和JMS(Java消息服务)等技术。 总之,学习Java是一个持续不断的过程,初期可能需要较长时间来掌握基础,但随着经验的积累,学习新语言的速度会...
- **综合库**:如JDBC、JNDI、RMI等,支持数据库连接、名称服务、远程方法调用等功能。 #### 四、Java程序设计语言 - **语言特性**:高级语言,使用自然的语法结构,易于理解和编写。 - **源文件**:源代码保存在`....
在JAVA学习之旅中,深入理解J2EE(Java 2 Platform, Enterprise Edition)框架是至关重要的一步。J2EE是专为开发企业级应用而设计的平台,它包含了一系列的服务和技术,如EJB、JMS、RMI、JDBC等,这些技术共同构成了...
Java Web应用模型的发展历程显示,从Applet、RMI、JavaBeans到EJB、Servlet、JSP,每一步技术的演进都极大提升了系统开发的效率。但是,缺乏项目经验和对新技术的深入理解使得大学生在开发过程中对设计模式和技术...
Java中的`javax`包是一个非常重要...对于Java初学者来说,理解`javax`包中的这些核心概念是进阶成为专业开发者的关键一步。通过查阅提供的`api`文档,你可以找到每个类和接口的详细说明,从而深入学习这些重要知识点。
### ACE网络编程学习笔记知识点详解 #### 一、面向对象中间件体系结构 **1.1 主机基础设施中间件** 主机基础设施中间件的主要目的是封装不同的底层实现,例如socket和线程,提供统一的接口给上层应用。这种封装有...
企业软件的发展历程从单层架构(Single Tier)到客户端/服务器(Client/Server,C/S)架构,再到多层(N-tier)架构,每一步都是为了提高系统的灵活性、可维护性和可扩展性。N-tier架构允许将表示逻辑、业务逻辑和...
从Java语言基础到网络编程,再到图形界面和Web开发,每一步都需要不断学习和实践。而数据库技术和Java Web开发则是软件设计中不可或缺的技能。只有全面掌握这些知识点,才能在IT行业不断进步,成为真正的软件设计...
- **表达式**: 学习Maximo7中的表达式语法,用于定义工作流、规则等逻辑处理。 通过以上步骤,您可以顺利完成Maximo7及其相关组件的安装配置,并能够导入和管理BIRT报表,从而更好地利用这些工具来提升企业的资产...
最后一步是部署 Web Service。这可以通过 IIS 或其他支持 ASP.NET 的 Web 服务器来完成。 #### 总结 通过上述步骤,你可以使用 C# 和 .NET 框架创建一个简单的 Web Service。Web Service 不仅能够实现跨平台通信,...
**Java Naming and ...理解并掌握JNDI对于任何Java开发者来说,都是提升分布式系统设计和实现能力的重要一步。通过阅读相关书籍和实践,你可以更深入地探索这个强大的工具,从而在复杂的分布式环境中游刃有余。
### Java精品:初学者的全面指南 ...Java的学习之路虽然漫长,但每一步都为成为专业程序员打下了坚实的基础。通过系统地学习和实践,初学者可以逐步掌握Java的核心概念和技术,最终实现自己的编程梦想。