`
damiao_cn
  • 浏览: 88283 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java RMI实例

    博客分类:
  • Java
阅读更多
我下面贴出代码的例子是网上转来的,我在这里主要要说一下在跑通这个例子可能会遇到的问题和解决办法,希望能为初学的朋友节省时间,以便快速入门RMI

创建RMI程序的6个步骤:
1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
2、定义一个实现该接口的类。
3、使用RMIC程序生成远程实现所需的残根和框架。
4、创建一个服务器,用于发布2中写好的类。
5. 创建一个客户程序进行RMI调用。
6、启动rmiRegistry并运行自己的远程服务器和客户程序

1步
定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常
package rmi;

import java.rmi.RemoteException;

/**
 * 第一步,定义一个远程接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常
 */

//接口里定义一个返回字符串的远程方法 SayHello(),这个远程接口 I_Hello必须是public的
//它必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。
//
//抛出这个异常的原因:由于任何远程方法调用实际上要进行许多低级网络操作,因此网络错误可能在调用过程中随时发生
//因此,所有的RMI操作都应放到try-catch块中


//需要从Remote继承
public interface I_Hello extends java.rmi.Remote{ 

    //需要抛出remote异常
    public String SayHello() throws RemoteException; 
}



2步
定义一个实现该接口的类
package rmi;

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;

/**
 * 第二步,定义一个实现远程接口的类
 */

//实现接口的类必须继承UnicastRemoteObject类,扩展java.rmi.server.UnicastRemoteObject

public class Hello extends UnicastRemoteObject //必须从UnicastRemoteObject 继承
        implements I_Hello {
    public Hello() throws RemoteException{ //需要一个抛出Remote异常的默认初始化方法
    }

    public String SayHello(){ //这个是实现I_Hello接口的方法
        return "Hello world !!";
    }
}



3步
使用RMIC程序生成远程实现所需的残根Stub 和 框架
这一步是关键,也是最容易出问题的地方,需要多说几句:
在RMI中,客户机上生成的调动调用参数和反调动返回值的代码称为残根。有的书上称这部分代码为“主干”。
服务器上生成的反调动调用参数和进行实际方法调用调动返回值的代码称为框架

2中的Hello编译好以后,我们就可以用RMIC命令来生成残根Stub
操作是:在cmd下到Hello.class 所在目录,运行以下命令:rmic Hello
命令执行完以后,将会在当前目录生成一个 Hello_Stub.class 这个就是我们远程调用时需要的类
如果您是照着上面的方法做的,现在应该会遇到报的第一个错:Class xxx not found
解决方法分两步
首先,打开环境变量,将项目路径D:\workspace_bohai_FXM\ztest(项目名)\rmi(包名)添加到classpath中,在cmd下set一下,看看是否设置好了
然后,cmd下输入要注意,如果你要rmic的.class文件在包下,就必须cd到目标.class文件所在包的目录下,此例是:D:\workspace_bohai_FXM\ztest>rmic rmi.Hello,在你的rmi目录下会生成两个文件Hello_Stub.class和Hello_Skel.class。Hello_Stub.class 这个就是我们远程调用时需要的类


4步
创建一个服务器,用于发布2中写好的类
package rmi;

import java.rmi.*;

/**
 * 4步,创建一个服务器,用于发布类Hello
 */

public class RMI_Server {
    public static void main(String[] args) {
        try {
            //实例化要发布的类
            Hello hello = new Hello();
            //绑定RMI名称 进行发布,即客户端通过这个名字查找的对象就是hello这个实例
            Naming.rebind("RMI_Hello", hello); 
            System.out.println("=== Hello server Ready === ");
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}




5步
创建一个客户程序进行RMI调用
package rmi;

/**
 * 5步,创建一个客户程序进行RMI调用
 */

import java.rmi.*;

public class RMI_Client {
    public static void main(String[] args) {
        try {
            I_Hello hello = (I_Hello) Naming.lookup("RMI_Hello"); //通过RMI名称查找远程对象
            //如果是异地的RMI调用请参照    rmi://127.0.0.1:1099/RMI_Hello         
            //端口1099是默认的RMI端口,如果你启动 rmiregistry 的时候,没有指定特殊的端口号,默认就是1099

            System.out.println(hello.SayHello()); //核心句:调用远程对象的方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}




6步
启动rmiRegistry并运行自己的远程服务器和客户程序
cmd下运行命令rmiregistry,然后放在一边不用管他(第一个cmd窗口)
然后通过cmd运行Server,直接在IDE里运行一般会报错:找不到Stub类,需要用下面的命令来运行,命令里指定了stub类的路径
cmd到D:\workspace_bohai_FXM\ztest>目录下运行java.exe -Djava.rmi.server.codebase=file:/D:\workspace_bohai_FXM\ztest/ rmi.RMI_Server
(注意:ztext是项目名,rmi是包,最后的那个ztest/后有一个空格)
回车后cmd会显示:=== Hello server Ready ===
(代表Server成功启动,第二个cmd窗口)
然后在运行Client就会看到你千辛万苦远程方法调用的结果:Hello world !!
呵呵,如果在上面过程中你遇到了其他问题,实在是不好意思了,我只是把我尝试RMI时遇到的问题的解决办法贴出来了,祝好运
分享到:
评论
4 楼 damiao_cn 2008-12-20  
lzj0470 写道

我想请问一下,如果是异地的话,能跑的起来吗?我是本地的话,完全没问题,你有没有试过异地呀,比如说 rmi://192.168.1.110:1099/RMI_Hello 

如果是异地的话我没试过,呵呵,不好意思。
后来我发现webservice的调用和这个很类似,在工作中用的也比较多,而直接写RMI的不太多,所以我就在没看过这东西
3 楼 lzj0470 2008-12-20  
我想请问一下,如果是异地的话,能跑的起来吗?我是本地的话,完全没问题,你有没有试过异地呀,比如说 rmi://192.168.1.110:1099/RMI_Hello 
2 楼 damiao_cn 2008-09-06  
呵呵,这是我从网上抄的例子,还请大哥多指点
1 楼 louisling 2008-09-04  
你的方法也太麻烦了吧?
注册服务器直接这样用 LocateRegistry.createRegistry(1099); 就好了.

相关推荐

    JAVA RMI 实例

    java rmi小例子源代码 ,运行Reg.java ,再执行Client客户端代码就能看效果。如果在不同jvm下执行,注意接口定义包路径客服端和服务端必须保持一致。 客服端包含文件有服务端接口的定义文件。

    JAVARMI实例[文].pdf

    在Java RMI实例中,我们通常会经历以下几个步骤: 1. **创建远程接口**:首先,我们需要定义一个远程接口,这个接口需要扩展`java.rmi.Remote`。远程接口中的所有方法都需要抛出`RemoteException`,这是因为远程...

    一个java RMI应用实例 构建简单的RMI应用

    创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...

    Java RMI 可运行实例

    3. **运行RMI实例** - **启动RMI注册表**:运行`rmiregistry`命令启动RMI注册表服务。 - **编译代码**:确保所有的Java源代码都已正确编译为字节码文件。 - **运行服务器**:使用`java`命令运行服务器端程序,这...

    java rmi spring 使用实例

    java rmi spring 使用实例,内涵服务端和客户端的源代码,测试可用。

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    java rmi 简单易懂的实例

    本实例旨在提供一个易于理解的Java RMI应用,帮助初学者快速掌握其基本概念和使用方法。完整的例子包括以下几个关键组成部分: 1. **接口定义**:在RMI中,远程对象需要实现一个接口,这个接口定义了可供远程调用的...

    基于JAVA RMI的聊天室

    - **客户端(Client)**: 客户端通过RMI连接到服务器,获取远程对象实例,并调用其方法来发送和接收消息。客户端可能包含用户界面,如GUI,用于输入和显示聊天内容。 ### 3. 图形界面 这个聊天室项目还包含了图形...

    JAVA RMI实现程序实例

    在这个"JAVA RMI实现程序实例"中,我们将会探讨如何使用RMI实现一个简单的“Hello, World”示例,并已经在两台机器上进行了成功的测试。 首先,我们需要了解RMI的基本概念。RMI的核心思想是将对象的方法调用转化为...

    java rmi java rmi

    根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...

    java_rmi.rar_RMI java_java.rmi

    这个"java_rmi.rar"压缩包包含的资源可能是一个Java RMI的实例教程或者代码示例。"www.pudn.com.txt"可能是一个包含相关说明或者下载链接的文本文件,而"rmi"可能是包含具体RMI示例代码的文件夹。 在RMI的基本流程...

    JavaRMI快速入门

    Java Remote Method Invocation(Java RMI)是Java编程语言中用于在网络间进行远程对象调用的技术。它是Java平台的标准部分,允许程序员在分布式环境中调用对象的方法,就像它们在同一台计算机上一样。Java RMI对于...

    java RMI简单Demo

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行透明的交互。在Java RMI中,一个对象可以调用另一个位于不同JVM(Java虚拟机)...

    关于java RMI分布式程序开发实例

    这个实例将带你深入理解Java RMI的原理和实际应用。 一、RMI基本概念 1. 远程接口:远程接口定义了可以在远程对象上调用的方法。这些接口需要继承`java.rmi.Remote`接口,并声明可能会抛出`java.rmi....

    java rmi 参考文档

    ### Java RMI (Remote Method Invocation) 概念与实践 #### 一、Java RMI简介 Java RMI(Remote Method Invocation)是一种允许调用不同Java虚拟机(JVM)上方法的机制。这些JVM可能位于不同的机器上,也可能在同一...

    Java RMI 简单示例

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于分布式计算的技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法。这个简单的示例展示了如何创建一个基本的...

    java远程调用rmi实例

    本实例将深入讲解如何使用Java RMI在Linux环境中启动远程服务,并在Windows环境下进行操作。 首先,理解RMI的基本原理:RMI系统由两部分组成,客户端和服务器端。服务器端暴露远程接口,客户端通过引用这个远程接口...

Global site tag (gtag.js) - Google Analytics