`

JavaRMI入门实战

    博客分类:
  • java
阅读更多
为通过网络执行其他机器上的代码,传统的方法不仅难以学习,而且易出错。解决这个问题的最佳方法是:某些对象正好位于另一台机器,我们可以发送一条消息,并获得返回结果,就像位于自己的本机器一样。Java远程方法调用(RMI)特性使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。

下面介绍一下必要的步骤,创建自己的RMI对象。

一、远程接口概念:
     RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。

   创建一个远程接口时,必须遵守下列规则:

1)  远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。

2)  远程接口必须扩展接口java.rmi.Remote。

3)  除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.

4)  作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。

下面是一个远程接口示例,

//PerfectTimeI.java

//The PerfectTime remote interface

package test;

import java.rmi.*;

public interface PerfectTimeI extends Remote {

    long getPerfectTime() throws RemoteException;

}

它表面上与其他的接口类似,只是对Remote进行了扩展,而且所有的方法都会“掷”出RemoteException.接口和方法都是Public的。

编译PerfectTimeI.java,生成PerfectTimeI.class(test是包,编译时注意路径)

G:\RMI>javac test\PerfectTimeI.java

二、远程接口的实施:
    服务器必须包含一个扩展了UnicastRemoteObject类,并实现远程接口。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。

   必须为远程对象定义构件器,即使只准备定义一个默认构件器,用它调用基础类构件器。必须把它明确地编写出来,因为它必须“掷”出RemoteException违例。

  下面列出远程接口PerfectTime的事实过程:他代表精确计时服务

//PerfectTime.java

//The implementation of the PerfectTime remote object

package test;

import java.net.*;

import java.rmi.*;

import java.rmi.registry.*;

import java.rmi.server.*;

public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI

{

//默认构件器,也要“掷”出RemoteException违例。

    public PerfectTime() throws RemoteException {

        super();

    }

public long getPerfectTime() throws RemoteException {

    return System.currentTimeMillis();

}

public static void main(String[] args) {

/*创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分,适用于RMI唯一一个是RMISecurityManager.*/

    System.setSecurityManager(new RMISecurityManager());

    try {

   /*创建远程对象的一个或多个实例,下面是PerfectTime对象*/

        PerfectTime pt = new PerfectTime();

   /*向RMI远程对象注册表注册至少一个远程对象。一个远程对象拥有的方法即可生成指向其他远程对象的句柄,这样,客户到注册表里访问一次,得到第一个远程对象即可.*/

        Naming.bind("PerfectTime", pt);

        System.out.println("Ready to do Time");

    } catch (Exception e) {

        e.printStackTrace();

    }

}

}

编译PerfectTime.java,生成PerfectTime.class(test是包,编译时注意路径)

G:\RMI>javac test\PerfectTime.java

三、创建根和干:
  创建RemoteObject的主干和框架。要完成这个工作可使用rmic编译器,rmic编译器生成远程对象的存根和骨架。存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法输入如下:

G:\RMI>rmic -d G:\RMI test.PerfectTime

执行这个命令,

若rmic成功运行,test目录里就会多出两个新类:

PerfectTime_Stub.class

PerfectTime_Skel.class

它们分别对应的是根(stub)和干(skeleton).

四、使用远程对象:
RMI全部的宗旨就是可能简化远程接口对象的使用。我们客户程序中要做的唯一一件额外事情是查找从服务器取回远程接口。下面就是编写的Java程序:将消息发给对象:

//DisplayPerfectTime.java

//Users remote object PerfectTime

package test;

import java.rmi.*;

import java.rmi.registry.*;

public class DisplayPerfectTime {

/*** DisplayPerfectTime 构造子注解。*/

public DisplayPerfectTime() {

    super();

}

public static void main(String[] args) {

    System.setSecurityManager(new RMISecurityManager());

    try {

        PerfectTimeI t = (PerfectTimeI) Naming.lookup("PerfectTime");

       for (int i = 0; i < 10; i++) {

           System.out.println("PerfectTime:" + t.getPerfectTime());

       }

    } catch (Exception e) {

        e.printStackTrace();

    }

}

}

编译DisplayPerfectTime.java.

G:\RMI>javac test\DisplayPerfectTime.java

五、启动注册并运行代码:
在运行PerfectTime类和DisplayPectTime类之前,用户必须首先在将要宿主PerfectTime的计算机上启动RMI注册(Registry)程序,即使将要运行PerfectTime的计算机与运行DisplayPerfectTime的是同一台机器,这一步也是必须的。注册表服务器的名字是rmiregistry.在32位Windows环境中,可使用: start rmiregistry 令其在后台运行。然后分别开两个不同的进程运行Server端和Client端:启动注册表服务器:

G:\RMI>start rmiregistry

绑定PerfectTime到注册,运行服务端程序:在Windows下,输入下列命令,在后台启动PerfectTime程序:

G:\RMI>java test.PerfectTime

Ready to do Time

运行客户端程序:如下

G:\RMI>java test.DisplayPerfectTime

PerfectTime:961722589649

PerfectTime:961722589669

PerfectTime:961722589679

PerfectTime:961722589679

PerfectTime:961722589689

PerfectTime:961722589689

PerfectTime:961722589689

PerfectTime:961722589699

PerfectTime:961722589699

PerfectTime:961722589699
分享到:
评论

相关推荐

    java rmi java rmi

    java rmi java rmijava rmi javajava rmi java rmi rmi

    编程语言JavaRMI入门教程.pdf

    编程语言JavaRMI入门教程.pdf

    java RMI技术实现的网络聊天室

    java RMI技术实现的网络聊天室 编译通过,很完整的。代码很有参考价值

    基于JAVA RMI的聊天室

    采用JAVA rmi,带图形界面,完全由自己实现的聊天室,具备基本的聊天功能,可以自己扩充功能

    JavaRMI快速入门

    这个是学习Java的开始阶段必须要了解和学习的重要内容,它能带领大家快速的进入Java的开发过程中来,给大家解决迷津....

    javaRMI反序列化漏洞验证工具

    检测javaRMI反序列化漏洞

    java Spring+RMI入门程序源代码

    java Spring+RMI入门程序源代码

    java RMI简单Demo

    java RMI

    JAVA RMI入门教程

    没有使用过RMI的学者来说这是一个很好的资源,很清晰很明确的讲述了RMI的工作原理和基本实例,很好的入门教材

    java RMI实现代码

    java RMI实现代码。分为客户端和服务器端,有清楚的代码注释。

    Java RPC和RMI代码实战

    Java RPC和RMI代码实战,有关键注释,为最简案例。Maven搭建,JDK8编译。 RPC体验:依次运行RpcProvider和RpcConsumer类。 RMI体验:RMITest中依次运行testServer和testClient方法。

    java RMI入门例子

    通过这个例子可以大概了解RMI的很多机制

    原创的JavaRMI项目

    这是原创的最简单的Java RMI入门项目,内含二个Eclipse项目,一是服务器端,二是客户端。非常简单,只看其中的注释就能理解(当然先要知道什么是RMI了),只供入门用。 这是用Java 1.7编辑的,如果你用的版本低,则...

    Java RMI 简单示例

    Java RMI 简单示例

    JavaRMI.pdf

    JavaRMI.pdf

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    RMI教程-入门经典

    RMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMI

    Java RMI.pdf

    《Java RMI》一书的英文版本,With Java RMI, you'll learn tips and tricks for making your RMI code excel. This book provides strategies for working with serialization, threading, the RMI registry, ...

    javaRMI完整版.pdf

    javaRMI完整版.pdf

    java rmi demo

    java rmi入门级实例:分为三个javase项目,rmi-api(存放公共的接口和实体),rmi-server(rmi服务器端),rmi-client(rmi客户端),其中服务端和客户端都依赖rmi-api项目

Global site tag (gtag.js) - Google Analytics