本篇用实例来说明采用Java进行RMI远程方法调用的实现方法,从而为分布应用软件的开发者提供参考和帮助。
Internet/Intranet的飞速发展使得Web应用日益广泛而复杂,Web早已不仅仅是超媒体信息的浏览工具,它正逐步发展成为分布异构环境中企业应用的通用前端和事务处理的展现窗口。在分布式环境异构中,各种机器所采用的操作系统、网络通信协议和应用软件千差万别,要实现信息共享和软件资源的整合十分困难,然而一个健壮的分布式计算框架能为可移植的分布式应用软件开发带来巨大的便利和好处。
分布式对象技术主要是在分布式异构环境下建立应用系统框架和对象构件。在应用系统框架的支撑下,开发者可以将软件功能封装为更易管理和使用的对象,这些对象可以跨越不同的软、硬件平台进行互操作。目前,分布式互操作标准主要有Microsoft的COM/DCOM标准、Sun公司的Java RMI标准和OMG组织的CORBA标准。
Java RMI调用实例
Java RMI简介
远程方法调用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式对象软件包,它的出现大大简化了分布异构环境中Java应用之间的通信。
要使用RMI,必须构建四个主要的类:远程对象的本地接口、远程对象实现、RMI客户机和RMI服务器。RMI服务器生成远程对象实现的一个实例,并用一个专有的URL注册。RMI客户机在远程RMI服务器上查找服务对象,并将它转换成本地接口类型,然后像对待一个本地对象一样使用它。
下面是一个简单的RMI实例,RMI客户机通过RMI服务器提供的方法实现对两个双精度浮点数的加减运算。例子虽然很简单,但掌握了Java RMI调用的基本原理和方法,在实现复杂应用时,我们需要做的也只是完善远程对象的实现类而已。
RMI实例分析
1.远程对象的本地接口声明(RMIOperate.java)
该类仅仅是一个接口声明,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个专有的URL注册它的一个实例。
具体代码如下:
package wf.rmi; //包名
import java.rmi.*; //导入类包
/*RMI本地接口必须从Remote接口派生*/
public interface RMIOperate extends Remote
{
/*接口中的具体方法声明,注意必须声明抛出RemoteException*/
public double add(double x, double y) throws RemoteException;
//输入两个浮点数,返回其和
public double minus(double x, double y) throws RemoteException;
//输入两个浮点数,返回其差
}
2.远程对象实现类(OperateImpl.java)
这个类应实现RMI客户机调用的远程服务对象的本地接口,它必须从UnicastRemoteObject继承,构造函数应抛出RemoteException异常。
具体代码如下:
package wf.rmi; //包名
//导入需要的类包
import java.rmi.*;
import wf.rmi.RMIOperate;
import java.rmi.server.UnicastRemoteObject;
public class OperateImpl extends UnicastRemoteObject implements RMIOperate
{
/*构造函数*/
public OperateImpl() throws RemoteException
{
}
/*实现本地接口中声明的add方法*/
public double add(double x, double y) throws RemoteException
{
double z = x + y;
return z;
}
/*实现本地接口中声明的minus方法*/
public double minus(double x, double y) throws RemoteException
{
double z = x - y;
return z;
}
}
3.RMI服务器类(RMIServer.java)
该类创建远程对象实现类OperateImpl的一个实例,然后通过一个专有的URL来注册它。所谓注册就是通过Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,将OperateImpl实例绑定到指定的URL上。
具体实现代码如下:
package wf.rmi; //包名
//导入需要的类包
import java.rmi.Naming;
import wf.rmi.OperateImpl;
public class RMIServer
{
public static void main(String[] args)
{
try
{
//创建远程对象的实现实例
OperateImpl operObj = new OperateImpl();
//提示信息
System.out.println("RMI Server Starting...");
//将实例注册到专有的URL
Naming.rebind("rmi:///RMIOperate", operObj);
//等待RMI客户机调用的提示信息
System.out.println("Waiting RMI Client Invoke...");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
4.RMI客户机类(RMIClient.java)
RMI客户使用java.rmi.Naming.lookup()方法,在指定的远程主机上查找RMI服务对象,若找到就把它转换成本地接口RMIOperate类型。它与CORBA不同之处在于RMI客户机必须知道提供RMI服务主机的URL,这个URL可以通过rmi://host/path或rmi://host:port/path来指定,如果省略端口号,就默认使用1099。Java.rmi.Naming.lookup()方法可能产生三个异常:Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException,三个异常都需要捕获。
下面是详细代码:
package wf.rmi; //包名
//导入需要的类包
import java.rmi.*;
import java.net.*;
import java.io.*;
public class RMIClient
{
public static void main(String[] args)
{
try
{
BufferedReader readIn = new BufferedReader(new
InputStreamReader(System.in));
String host = "localhost"; //默认为本地主机
//带输入参数时,将host设置为指定主机
if (args.length > 0)
host = args[0];
//根据指定的URL定位远程实现对象
RMIOperate rmiObj = (RMIOperate)Naming.lookup("rmi://" + host +
"/RMIOperate"); //提示输入运算参数1
System.out.println("Please Input Data1: ");
String str1 = readIn.readLine(); //读取输入参数1
double x = 0;
try
{
x = Double.parseDouble(str1); //分析输入参数1,转换为double类型
}
catch(NumberFormatException nfe)
{
x = 0; //如果转换异常,则重置x为0
}
//提示输入运算参数2
System.out.println("Please Input Data2: ");
String str2 = readIn.readLine();//读取输入参数2
double y = 0;
try
{
y = Double.parseDouble(str2); //分析输入参数2,转换为double类型
}
catch(NumberFormatException nfe)
{
y = 0; //如果转换异常,则重置y为0
}
//调用远程对象的本地接口方法,实现输入参数的加、减运算,并输出结果
System.out.println("Data1 Add Data2 Result is: " + rmiObj.add(x, y));
System.out.println("Data1 minus Data2 Result is: " +
rmiObj.minus(x, y));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
RMI Server/Client的编译与运行
(1).编译所有的源代码(如图1)
图1
(2).生成客户端存根和服务器框架(如图2)
图2
这将构造OperateImpl_Stub.class和OperateImpl_Skel.class。这时可将所有的Class文件打包成jar,并将其分别置于RMI客户机和RMI服务器的ClassPath中(如图3):
图3
当然,也可以只将RMIOperate.class、RMIClient.class和OperateImpl_Stub.class复制到RMI客户机,将RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class复制到RMI服务器。
(3).启动RMI注册(如图4)
图4
(4).运行和调用
● 在服务器上执行RMIServer(如图5)
图5
● 在本地客户机上运行RMIClient(如图6)
图6
● 在远程客户机上运行RMIClient(须指明RMI服务器主机名或IP地址,如图7)
图7
至此,RMI调用完成。
摘自:
http://youngyj1982.bokee.com/
分享到:
相关推荐
Java中的RMI(Remote Method Invocation)技术是一种在分布式环境中实现对象间远程调用的机制,它允许Java对象在不同的JVM之间进行通信。RMI是Java标准库的一部分,为开发者提供了一种简单、高效的手段来构建分布式...
分布式对象技术课程实践:基于 rmi 的数据库中间件设计,并利用中间件建立一个数据库应用(Javaweb 项目)。涉及到Java 面向对象编程、JavaRMI 技术、JavaJDBCB、SpringBoot 项目的编写。
1可能介绍了中间件的基本概念和重要性,Lecture_3可能深入讨论了Jini的架构和实现细节,Lecture_4和Lecture_5可能讲解了SOAP的消息格式和通信过程,Lecture_6和Lecture_7可能涉及RMI的编程模型和优化策略,而Lecture...
中间件是一种在操作系统和应用程序之间提供服务的软件,它扮演着连接不同系统和应用的关键角色。本实验报告和源码涵盖了多种中间件技术,包括COM(Component Object Model)、EJB(Enterprise JavaBeans)、CORBA...
Java RMI(Remote Method Invocation)和CORBA(Common Object Request Broker Architecture)是两种在分布式环境中实现对象间通信的重要技术。本教程将详细讲解这两个概念及其应用。 首先,让我们了解一下RMI。RMI...
了解Bean的属性、事件和设计模式,以及如何使用JavaBeans API和IntelliJ IDEA、Eclipse等IDE中的可视化工具进行开发,是提升Java应用开发效率的关键。 RMI是Java中远程方法调用的机制,允许对象在不同的Java虚拟机...
在Java中,RMI(Remote Method Invocation)和CORBA(Common Object Request Broker Architecture)是两种重要的分布式计算框架。 RMI是Java特有的远程方法调用机制,它使得开发者可以像调用本地对象的方法一样调用...
【描述】:本文探讨了在系统异构应用领域如何利用Java RMI进行二次开发,旨在在保留原系统功能的同时,通过Java的更新升级减少工作量,并发挥其在分布式网络应用中的优势。 【标签】:“java” 【主要内容】: 在...
Java Remote Method Invocation(RMI)是...在“RMI简单示例 - Java Remote Methods Invocation”中,我们可以学习到如何创建基本的RMI应用,包括定义接口、实现接口、注册远程对象以及从客户端调用这些对象的方法。
5. 对象中间件:如CORBA和Java RMI,使得对象能够在网络中的不同节点间透明调用,实现对象的分布式和重用。 在实际应用中,中间件的选择和设计取决于具体需求。例如,BEA公司的WebLogic、IBM的WebSphere和Oracle的...
4. **性能**:由于RMI的轻量级特性,通常在Java环境中,其性能可能优于CORBA。不过,这取决于具体的应用场景和配置。 5. **学习曲线**:RMI的学习曲线较短,适合于熟悉Java的开发者,而理解并熟练使用CORBA可能需要...
RMI最初由Java语言提出并广泛应用,但此处提及的是如何在VC++环境中实现RMI功能。在VC++中实现RMI并不像在Java中那样直接,因为VC++本身并不内置RMI支持,但可以通过第三方库或者自定义实现来达到类似的效果。 首先...
【RMI介绍】远程方法调用(Remote Method Invocation,RMI)是Java平台中的一个重要概念,主要用于构建分布式应用程序。RMI使得Java对象可以跨网络进行交互,仿佛它们在同一台计算机上运行。它在Enterprise ...
2. **中间件或通信协议**:另一种方式是通过网络通信,如HTTP、RPC、RMI(远程方法调用)等协议,将C++和Java应用作为服务端和客户端进行交互。这种方式适合分布式系统,其中C++可能作为后台处理引擎,Java则负责...
- **中间件的作用**:中间件位于操作系统之上,应用程序之下,它提供了一组通用的服务和功能,用于简化应用程序的开发和维护。这些服务包括但不限于事务管理、消息传递、负载均衡等。 **1.3 中间件的基本概念** - ...
在Java编程领域,分布式多线程中间件是高级主题,涉及到复杂的系统设计和优化。本教程合集将深入探讨这些核心概念,旨在帮助开发者提升技能并应对大型、高并发的应用场景。 首先,让我们来理解“Java高级教程”的...
在这个“RMI.rar_DEMO_rmi”压缩包中,包含了一个RMI的示例项目,对于初学者或者想要深入理解中间件技术的人来说是一个很好的学习资源。 首先,我们来了解RMI的基本概念。RMI的核心思想是,一个Java对象可以在本地...
在Java中实现分布式应用程序通常需要理解并掌握一系列关键技术和概念,包括但不限于网络编程、远程方法调用(RMI)、Java命名和目录接口(JNDI)、Java消息服务(JMS)以及分布式数据存储等。 1. **Java RMI...
中间件是一种重要的软件类别,它位于操作系统、网络和数据库之间,为上层的应用软件提供运行和开发环境。中间件的主要作用在于...理解并熟练运用中间件,尤其是消息中间件,对于构建高效、可靠的分布式应用至关重要。