(来源:http://ybwen.home.chinaren.com)
为通过网络执行其他机器上的代码,传统的方法不仅难以学习,而且易出错。解决这个问题的最佳方法是:某些对象正好位于另一台机器,我们可以发送一条消息,并获得返回结果,就像位于自己的本机器一样。Java远程方法调用(RMI)特性使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。
下面介绍一下必要的步骤,创建自己的RMI对象。
一、远程接口概念:
RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。
创建一个远程接口时,必须遵守下列规则:
1) 远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。
2) 远程接口必须扩展接口java.rmi.Remote。
3) 除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.
4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。
下面是一个远程接口示例,
//PerfectTimeI.java<o:p> </o:p>
//The PerfectTime remote interface<o:p> </o:p>
package test;<o:p> </o:p>
import java.rmi.*;<o:p> </o:p>
public interface PerfectTimeI extends Remote {<o:p> </o:p>
long getPerfectTime() throws RemoteException;<o:p> </o:p>
}<o:p> </o:p>
它表面上与其他的接口类似,只是对Remote进行了扩展,而且所有的方法都会“掷”出RemoteException.接口和方法都是Public的。<o:p> </o:p>
编译PerfectTimeI.java,生成PerfectTimeI.class(test是包,编译时注意路径)
G:\RMI>javac test\PerfectTimeI.java<o:p> </o:p>
二、远程接口的实施:
服务器必须包含一个扩展了UnicastRemoteObject类,并实现远程接口。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。
必须为远程对象定义构件器,即使只准备定义一个默认构件器,用它调用基础类构件器。必须把它明确地编写出来,因为它必须“掷”出RemoteException违例。
下面列出远程接口PerfectTime的事实过程:他代表精确计时服务
//PerfectTime.java<o:p> </o:p>
//The implementation of the PerfectTime remote object<o:p> </o:p>
package test;<o:p> </o:p>
import java.net.*;<o:p> </o:p>
import java.rmi.*;<o:p> </o:p>
import java.rmi.registry.*;<o:p> </o:p>
import java.rmi.server.*;<o:p> </o:p>
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI <o:p></o:p>
{<o:p> </o:p>
//默认构件器,也要“掷”出RemoteException违例。<o:p> </o:p>
public PerfectTime() throws RemoteException {<o:p> </o:p>
super();<o:p> </o:p>
}<o:p> </o:p>
public long getPerfectTime() throws RemoteException {<o:p> </o:p>
return System.currentTimeMillis();<o:p> </o:p>
}<o:p> </o:p>
public static void main(String[] args) {<o:p> </o:p>
/*创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分,适用于RMI唯一一个是RMISecurityManager.*/<o:p> </o:p>
System.setSecurityManager(new RMISecurityManager());<o:p> </o:p>
try {<o:p> </o:p>
/*创建远程对象的一个或多个实例,下面是PerfectTime对象*/<o:p> </o:p>
PerfectTime pt = new PerfectTime();<o:p> </o:p>
/*向RMI远程对象注册表注册至少一个远程对象。一个远程对象拥有的方法即可生成指向其他远程对象的句柄,这样,客户到注册表里访问一次,得到第一个远程对象即可.*/<o:p> </o:p>
Naming.bind("PerfectTime", pt);<o:p> </o:p>
System.out.println("Ready to do Time");<o:p> </o:p>
} catch (Exception e) {<o:p> </o:p>
e.printStackTrace();<o:p> </o:p>
}<o:p> </o:p>
}<o:p> </o:p>
}<o:p> </o:p>
编译PerfectTime.java,生成PerfectTime.class(test是包,编译时注意路径)
G:\RMI>javac test\PerfectTime.java<o:p> </o:p>
三、创建根和干:
创建RemoteObject的主干和框架。要完成这个工作可使用rmic编译器,rmic编译器生成远程对象的存根和骨架。存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法输入如下:
G:\RMI>rmic -d G:\RMI test.PerfectTime
执行这个命令,
若rmic成功运行,test目录里就会多出两个新类:
PerfectTime_Stub.class<o:p> </o:p>
PerfectTime_Skel.class<o:p> </o:p>
它们分别对应的是根(stub)和干(skeleton).
四、使用远程对象:
RMI全部的宗旨就是可能简化远程接口对象的使用。我们客户程序中要做的唯一一件额外事情是查找从服务器取回远程接口。下面就是编写的Java程序:将消息发给对象:
//DisplayPerfectTime.java<o:p> </o:p>
//Users remote object PerfectTime<o:p> </o:p>
package test;<o:p> </o:p>
import java.rmi.*;<o:p> </o:p>
import java.rmi.registry.*;<o:p> </o:p>
public class DisplayPerfectTime {<o:p> </o:p>
/*** DisplayPerfectTime 构造子注解。*/<o:p> </o:p>
public DisplayPerfectTime() {<o:p> </o:p>
super();<o:p> </o:p>
}<o:p> </o:p>
public static void main(String[] args) {<o:p> </o:p>
System.setSecurityManager(new RMISecurityManager());<o:p> </o:p>
try {<o:p> </o:p>
PerfectTimeI t = (PerfectTimeI) Naming.lookup("PerfectTime");<o:p> </o:p>
for (int i = 0; i < 10; i++) {<o:p> </o:p>
System.out.println("PerfectTime:" + t.getPerfectTime());<o:p> </o:p>
}<o:p> </o:p>
} catch (Exception e) {<o:p> </o:p>
e.printStackTrace();<o:p> </o:p>
}<o:p> </o:p>
}
}<o:p> </o:p>
编译DisplayPerfectTime.java.
G:\RMI>javac test\DisplayPerfectTime.java<o:p> </o:p>
五、启动注册并运行代码:
在运行PerfectTime类和DisplayPectTime类之前,用户必须首先在将要宿主PerfectTime的计算机上启动RMI注册(Registry)程序,即使将要运行PerfectTime的计算机与运行DisplayPerfectTime的是同一台机器,这一步也是必须的。注册表服务器的名字是rmiregistry.在32位Windows环境中,可使用: start rmiregistry 令其在后台运行。然后分别开两个不同的进程运行Server端和Client端:启动注册表服务器:
G:\RMI>start rmiregistry<o:p> </o:p>
绑定PerfectTime到注册,运行服务端程序:在Windows下,输入下列命令,在后台启动PerfectTime程序:
G:\RMI>java test.PerfectTime<o:p> </o:p>
Ready to do Time<o:p> </o:p>
运行客户端程序:如下
G:\RMI>java test.DisplayPerfectTime<o:p> </o:p>
PerfectTime:961722589649<o:p> </o:p>
PerfectTime:961722589669<o:p> </o:p>
PerfectTime:961722589679<o:p> </o:p>
PerfectTime:961722589679<o:p> </o:p>
PerfectTime:961722589689<o:p> </o:p>
PerfectTime:961722589689<o:p> </o:p>
PerfectTime:961722589689<o:p> </o:p>
PerfectTime:961722589699<o:p> </o:p>
PerfectTime:961722589699<o:p> </o:p>
PerfectTime:961722589699<o:p> </o:p>
分享到:
相关推荐
【标题】:“RMI入门” 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种用于在分布式环境中实现对象间通信的技术。RMI允许一个Java对象调用网络另一端的Java对象的方法,就像调用本地对象...
Java技术不仅包括了Java语言本身,还包括了一系列的技术组件和API,如Java Media APIs、Security APIs、Management APIs、Java Applet、Java RMI(远程方法调用)、Java Bean、Java OS、Java Servlet、Java Server ...
第二部分则深入探讨了JSF RI(Reference Implementation)、JTA(Java Transaction API)、JNDI(Java Naming and Directory Interface)、RMI(Remote Method Invocation)、JMS(Java Message Service)、JavaMail...
【Dubbo入门到精通架构高级课程】是一门深入解析Dubbo框架的全面教程,旨在帮助初学者和进阶者理解并掌握这个强大的Java分布式服务框架。该课程包含了视频讲解、课件资料以及配套的源码,确保学习者能理论与实践相...
9. **协议与序列化**:Dubbo支持多种通信协议,如Dubbo协议、HTTP、RMI等,同时提供Hessian、Java序列化等多种序列化方式,用于服务间的通信和数据交换。 10. **服务监控**:Dubbo提供了一套完整的监控体系,可以...
【描述】中提到的"**dubbo入门 dubbo_demo.zip**"多次,这表明这个压缩包包含的是一个基础的教程或者实战案例,目的是帮助用户快速理解Dubbo的基本用法。由于描述内容重复,我们可以推断这个入门示例可能非常注重...
综上所述,这份Java培训大纲旨在为企业培养具备实战经验的高级软件开发工程师,通过系统的理论学习与实践操作相结合的方式,帮助学员掌握最新的Java技术栈,提高解决实际问题的能力,从而顺利进入软件开发行业并成为...
六、JMX实战入门 创建一个简单的MBean,例如管理一个计数器: ```java public class Counter implements ManagedBean { private int count = 0; public void increment() { count++; } public int getCount...
《Dubbo分布式系统入门教学》 Dubbo是一个高性能、轻量级的开源Java RPC框架,由阿里巴巴开发并贡献给Apache基金会。它旨在提供一个简单、高效的服务治理解决方案,帮助开发者构建微服务架构。本教学课件将带领你...
3. **RMI(Remote Method Invocation)/CORBA(Common Object Request Broker Architecture)**:学习远程对象调用和服务之间的交互。 #### 四、设计模式与框架 1. **设计模式**:通过学习GOF(Gang of Four)的23...
总的来说,"Ice经典入门和实例"是一套完整的学习资料,涵盖了Ice的基本概念、核心功能、高级特性和实战应用,对于想要掌握这个分布式对象中间件的开发者来说,是非常宝贵的资源。通过深入学习和实践,你将能熟练地...
### J2EE电子商务系统开发从入门到精通 #### 第1章 J2EE概论 **1.1 简单双层架构到复杂多层架构** - **1.1.1 双层(C/S)软件架构设计** - C/S架构即客户端/服务器架构,是一种传统的软件架构方式。在这种架构中...
1. **快速入门**:指导用户如何在项目中引入Dubbo,创建服务提供者和消费者,以及启动和测试服务。 2. **配置详解**:详细解读Dubbo的XML配置文件,包括服务、引用、注册中心、协议、过滤器等元素的配置。 3. **...
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java服务治理框架,它致力于提供一种简单、高效的服务发现、调用、监控和管理能力,是微服务架构中不可或缺的一部分。本资料集合包含了Dubbo的实际应用示例代码以及相关...
### EJB轻松掌握的八步 #### 引言 EJB(Enterprise JavaBeans)作为Java...接下来,我们将会详细介绍如何从零开始学习EJB,包括环境搭建、基础概念理解以及实战编程技巧等内容,让EJB的学习过程变得更加轻松和高效。
1. **Java语言编程知识**:掌握Java编程的基础是非常重要的,推荐《Java编程思想》这本书作为入门书籍,了解Java的基本语法、面向对象编程等概念。 2. **Spring框架开发及应用**:Spring框架是Java开发中非常重要的...
UAP Web开发平台遵循J2EE标准技术,包括JDBC、JSP、JavaServlet、XML、EJB、RMI、Cache等,并且符合CSS、JavaScript、Ajax、JQuery和HTML5等前端技术规范。门户集成开发遵循JSR168/286规范,这为开发者提供了一种...