`

JAVA RMI实现过程分析

    博客分类:
  • JAVA
阅读更多
JAVA RMI 快速入门实例

本实例为参考多篇文章写就而成,网上及书上各类文章介绍如何使用RMI有多种实例可参考,譬如有:

1. 用命令rmiregistry启动RMI注册服务的
2. 同时创建存根(stub)和骨架(skeleton)的
3. 只创建存根类的的(jdk1.2以后版本)
4. 通过RemoteRef和rmi://协议字串方式的
5. 比较少讲到的用LocateRegistry直接在代码上启动RMI注册服务的。

以上描述并非明显分类,比如,你总是可以选择用rmiregistry或者代码LocateRegistry启动RMI注册服务

下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用。

分为以下四个步骤

1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
4. 客户端查找远程对象,并调用远程方法(HelloClient)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用

具体代码及对应步骤如下:

1. 创建远程接口及声明远程方法(HelloInterface.java)


java 代码
package com.unmi;   
  
import java.rmi.*;   
  
/**  
* 远程接口必须扩展接口java.rmi.Remote  
*/  
public interface HelloInterface extends Remote   
{   
   /**  
    * 远程接口方法必须抛出 java.rmi.RemoteException  
    */  
   public String say() throws RemoteException;   
}   
2. 实现远程接口及远程方法(继承UnicastRemoteObject)Hello.java

java 代码
package com.unmi;   
  
import java.rmi.*;   
import java.rmi.server.*;   
  
/**  
* 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface  
*/  
public class Hello extends UnicastRemoteObject implements HelloInterface   
{   
   private String message;   
  
   /**  
    * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常  
    */  
   public Hello(String msg) throws RemoteException   
   {   
      message = msg;   
   }   
  
   /**  
    * 远程接口方法的实现  
    */  
   public String say() throws RemoteException   
   {   
      System.out.println("Called by HelloClient");   
      return message;   
   }   
}   
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)

java 代码
package com.unmi;   
  
import java.rmi.Naming;   
import java.rmi.registry.LocateRegistry;   
  
public class HelloServer   
{   
   /**  
    * 启动 RMI 注册服务并进行对象注册  
    */  
   public static void main(String[] argv)   
   {   
      try  
      {   
         //启动RMI注册服务,指定端口为1099 (1099为默认端口)   
         //也可以通过命令 $java_home/bin/rmiregistry 1099启动   
         //这里用这种方式避免了再打开一个DOS窗口   
         //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用   
         LocateRegistry.createRegistry(1099);   
           
         //创建远程对象的一个或多个实例,下面是hello对象   
         //可以用不同名字注册不同的实例   
         HelloInterface hello = new Hello("Hello, world!");   
           
         //把hello注册到RMI注册服务器上,命名为Hello   
         Naming.rebind("Hello", hello);   
            
         //如果要把hello实例注册到另一台启动了RMI注册服务的机器上   
         //Naming.rebind("//192.168.1.105:1099/Hello",hello);   
           
         System.out.println("Hello Server is ready.");   
      }   
      catch (Exception e)   
      {   
         System.out.println("Hello Server failed: " + e);   
      }   
   }   
}  
4. 客户端查找远程对象,并调用远程方法(HelloClient)

java 代码
package com.unmi;   
  
import java.rmi.Naming;   
  
public class HelloClient   
{   
   /**  
    * 查找远程对象并调用远程方法  
    */  
   public static void main(String[] argv)   
   {   
      try  
      {   
         HelloInterface hello = (HelloInterface) Naming.lookup("Hello");   
            
         //如果要从另一台启动了RMI注册服务的机器上查找hello实例   
         //HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");   
            
         //调用远程方法   
         System.out.println(hello.say());   
      }   
      catch (Exception e)   
      {   
         System.out.println("HelloClient exception: " + e);   
      }   
   }   
}   
  
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用

代码如何编译这里就不细讲

(1)打开一个Dos窗口执行命令 java com.unmi.HelloServer 启动服务HelloServer

E:workspaceTestRMIbin>java com.unmi.HelloServer
Hello Server is ready.

运行成功则可以看到 Hello Server is ready

(2)打开另一个Dos窗口执行命令 java com.unmi.HelloClient 运行客户端程序

E:workspaceTestRMIbin>java com.unmi.HelloClient
Hello, world!

调用成功则可以看到 Hello, world!

并且在启动服务端的窗口中看到紧跟 Hello Server is ready. 打印出
Called by HelloClient

如果您能一路顺畅的执行到这里,恭喜!您已度过了一个轻快的RMI之旅。

最后来个说明:

本实例中并没有用到JDK所带的命令 rmic 编译实现类得到存根(Stub)类,也没用命令 rmiregistry 命令来启动RMI注册服务。在启动 rmiregistry之前必须能让它加载到相应的stub类,这就是造成**_Stub 类找不到的原因。

如果只是按上面的代码,则服务程序 HelloServer 和客户端程序 HelloClient 都必须运行在本机(如此则RMI有何意义呢?);别急,只要修改HelloClient类,使用第二种形式的lookup查找语句,注释第一条 lookup语句,取消注释第二条lookup语句

         //HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
       
         //如果要从另一台启动了RMI注册服务的机器上查找hello实例
         HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");

其中的IP地址和端口号1099为 RMI 注册服务器的IP和端口号,这样你的HelloClient就可以在另一台机器运行了,当然HelloInterface类必须能找到(但也可指定参数- Djava.rmi.server.codebase从网络加载HelloInterface类)。lookup("Hello")默认为从本机 127.0.0.1的1099端口上查找Hello命令对象,如果第二条语句写成lookup("192.168.1.105/Hello")与原语句是同等的,因为默认端口号就是1099。

代码中 HelloServer 和 HelloClient 省略了设置安全管理器的过程 System.setSecurityManager(new RMISecurityManager()); ,如果设置的安全管理则必须编写相应的访问策略文件,并且在执行时指定参数

无论是启动服务端还是客户端都可以用参数 -Djava.rmi.server.codebase=http://unmi.blogcn.cn/bin 的形式,像JNP一样从网络上加载类,这样更方便于RMI客户端的部署,如RMI客户端是一个Applet

可以拿单独一台机器运行 rmiregistry (它需要能加载到相应的stub类,设置classpath)或用LocateRegistry.createRegistry(port),只作为 RMI远程对象的RMI集中注册的服务器,真正提供服务对象只往上注册,客户端只需从注册服务器上查找远程对象引用,然后调用远程方法,具体由谁提供服务由注册服务器来帮助联络。

还可以用 RMI Activation 编程方式来实现RMI远程方法调用,具体请参考 http://java.sun.com/j2se/1.4.2/docs/guide/rmi/activation.html

把HelloServer和HelloClient中的 "//192.168.1.105:1099/Hello 写成 rmi:/192.168.1.105:1099/Hello 感觉会好看一些,因为直接感觉就是在处理rmi协议。

参考资料:
1. JAVA RMI Tutorial
2. Getting Started Using RMI
3. JavaRMI入门实战
4. 使用RMI和CORBA进行分布式java程序设计
5. Think in java中网络编程RMI部分


分享到:
评论

相关推荐

    分布式Java RMI实现的学生成绩管理系统

    分布式Java RMI(Remote Method Invocation)技术是一种在Java平台中实现分布式计算的重要工具,它允许一个对象调用在不同 JVM(Java Virtual Machine)上的另一个对象的方法。在这个项目中,我们利用RMI构建了一个...

    RMI聊天室-Java实现

    9. **测试与调试**:在开发过程中,使用jconsole或jvisualvm等工具可以帮助监控RMI应用的状态,进行性能分析和故障排查。 10. **部署与配置**:RMI应用需要正确配置JVM的classpath、rmiregistry的启动、以及可能的...

    JavaRMI超棒书

    Java远程方法调用(Java Remote Method Invocation,简称Java RMI)是一种用于实现远程对象之间通信的技术,它是Java平台的一个核心组件,主要用于解决分布式环境中不同进程间的数据交换问题。Java RMI提供了一种...

    Java RMI 远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...

    JAVA rmi教学课件

    JAVA RMI(Remote Method Invocation)是一种Java平台上的技术,用于实现不同Java虚拟机(JVM)之间的远程对象通信,从而可以共享资源和处理能力。RMI的目标是提供位置透明性,使得开发者无需关心对象是在本地还是...

    JAVA RMI入门教程

    定位远程对象的过程通常涉及RMI的命名服务,比如使用Java Naming and Directory Interface (JNDI)。客户端在编写时需要知道提供命名服务的主机和端口,通过JNDI服务查询并获取远程对象的引用。RMI命名服务允许注册和...

    Java RMI 用于远程调用 进行分布式开发

    Java RMI(Remote Method Invocation)是Java平台提供的一种实现分布式计算的技术,它允许开发者在不同JVM间进行方法调用,如同调用本地对象一样简单。通过RMI,开发者能够构建出强大的分布式应用程序。 #### Java ...

    Java-RMI:Java 的 RMI 实现,在 Java 中

    RMI是Java在分布式环境中实现对象间通信的重要手段,它简化了分布式应用程序的开发过程。在这个Java-RMI项目中,我们可以看到它是作为卡内基梅隆大学15-440分布式系统课程的一个实践部分,旨在让学生深入理解和应用...

    JAVA RMI远程调用方法代码

    - 创建并实现一个远程接口,该接口需要继承`java.rmi.Remote`接口,并声明可能抛出`RemoteException`的方法。 - 实现该远程接口,创建一个具体的类来完成实际的业务逻辑。 - 使用`UnicastRemoteObject`将远程对象...

    RMI实现的网络五子棋

    【标题】"RMI实现的网络五子棋"是一个基于Java Remote Method Invocation (RMI)技术构建的在线游戏项目,允许玩家在两台计算机之间进行实时的五子棋对战。RMI是Java平台中用于分布式计算的重要工具,它允许对象在...

    Java RMI demo

    在这个"Java RMI demo"中,我们可以通过分析和运行提供的代码来理解RMI的工作原理。 1. **RMI基本概念** - **远程接口(Remote Interface)**:定义了客户端可以调用的远程方法,它继承自`java.rmi.Remote`接口。 ...

    JavaRMI

    Java RMI(Remote Method Invocation)是Java平台中用于实现分布式计算的一种技术。它允许Java对象在不同的 JVM(Java Virtual Machine)之间进行通信,仿佛这些对象都在同一台机器上一样。这个技术的核心概念是远程...

    java rmi shi

    Java RMI (Remote Method Invocation) 是一种Java技术,用于在分布式环境中实现对象之间的远程方法调用。RMI允许开发人员编写可以在网络上其他计算机上执行的方法,就像在本地一样简单。RMI结合了面向对象技术和网络...

    基于RMI的分布式议程管理系统(问题分析+代码)

    在"李亚方实践报告.doc"和"实验六"这两个文件中,可能详细记录了项目的实现过程、遇到的问题以及解决方案。这可能包括了RMI配置、服务器和客户端的代码实现、测试结果以及性能评估等内容。通过阅读这些文档,我们...

    RMI动态下载类分析及代码

    这个过程涉及到了Java的序列化和反序列化机制,以及`java.rmi.server.RMIClassLoader`类的作用。 1. **序列化**:远程方法的参数或返回值可能包含服务器特有的类,这些类需要被序列化成字节流,通过网络传输。 2. *...

    liaotianshi.rar_RMI聊天室_java 网络_rmi _rmi 聊天_网络聊天室

    【标题】"liaotianshi.rar_RMI聊天室_java 网络_rmi _rmi 聊天_网络聊天室" 涉及的主要知识点是使用Java的远程方法调用(Remote Method Invocation, RMI)技术来实现一个网络聊天室。RMI是Java平台提供的一种分布式...

    07-RMI 利用分析.pdf

    Java远程方法调用(Java RMI)是Java语言中实现远程过程调用(RPC)的一种应用程序编程接口。它允许客户机上的程序调用远程服务器上的对象方法,即Java中的远程对象。使用RMI可以在网络环境中分布操作,使得Java编程...

    java实现简单远程监控

    在IT行业中,远程监控是一项重要的技术,...总的来说,Java实现远程监控是一个涉及JMX、RMI以及网络编程的综合过程。通过合理设计和实现,我们可以构建出一个强大且灵活的监控解决方案,有效管理和维护我们的Java应用。

    基于RMI和Socket的带数据库的java聊天软件 客户端和服务器端

    Java聊天软件是网络通信的一种典型应用,而基于RMI(Remote Method Invocation)和Socket的实现方式则为这种软件提供了高效且灵活的通信机制。RMI是Java平台内建的一种远程对象调用技术,它允许一个Java对象调用另一...

    rmi-lite 1.0

    【rmi-lite 1.0】是一个轻量级的Java Remote Method Invocation (RMI)实现,它是Java RMI技术的一个简化版本,适用于那些不需要完整RMI功能但仍然希望利用远程对象交互的项目。RMI是Java平台上的一个核心特性,它...

Global site tag (gtag.js) - Google Analytics