`
goto0917
  • 浏览: 46728 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论
  • take: 这是POI方式,不是JXLS方式. JXLS包路径都是net ...
    jxls
阅读更多
RMI是Remote Method Invocation(远程方法调用)的 所写。它允许一个Java程序调用网络中另一台计算机上的Java方法,就如调用本机的方法一样。实现RMI调用的程序和被调用的方法,都必须是Java代码,即客户端和服务器端都必须通过纯Java实现。

RMI是基于Java的分布式编程模型,使用RMI进行远程方法调用时,无须考虑方法底层的网络传输细节。下面使用RMI的示例程序:

先编写RMI服务器端,RMI需要通过远程接口“暴露”服务。也就是说,所有想被客户机调用的方法都必须在Remote接口里声明,否则无法完成调用。远程接口如下:

远程接口必须集成java.rmi.Remote接口

public interface Server extends Remote

{

         //所有在Remote接口里声明的方法都必须抛出RemoteException异常

    String helloWorld(String name) throws RemoteException;

    Person getPerson(String name,int age)throws RemoteException;

}

远程接口必须继承java.rmi.Remote接口。远程接口里声明的方法会通过网络传输,而网络是不可靠的,因此,所有的远程方法都必须抛出RemoteException。RMI服务是典型的面向接口编程,只有在远程接口里定义的方法才会作为远程服务。

下面是远程服务提供类,远程服务提供类必须实现远程接口,并继承java.rmi.server.UnicastRemoteObject对象,继承该类能“暴露”远程服务。

//远程服务类,远程服务类必须继承UnicastRemoteObject,并实现Remote接口

public class ServerImpl extends UnicastRemoteObject implements Server

{

         //远程服务类必须拥有构造器,且构造器必须抛出RemoteException异常

    public ServerImpl()throws RemoteException

    {

}

//实现Remote接口必须实现的方法

    public String helloWorld(String name)throws RemoteException

    {

           return name + ", 您好!";

    }

//实现Remote接口必须实现的方法

    public Person getPerson(String name,int age)throws RemoteException

    {

           return new Person(name,age);

    }

         //下面是服务类的本地方法,不会“暴露”为远程服务。

         public void info()

{

         System.out.println(“我是本地方法”);

}

//下面提供程序入口,将远程类实例绑定为本机的服务。

    public static void main(String[] args)throws Exception

{

           //创建远程服务类实例

           Server imp = new ServerImpl();

                   //注册远程服务的端口

                   LocateRegistry.createRegistry(1099);

                   //将远程服务实例绑定为远程服务。

                   Naming.rebind("rmi://:1099/fdf", imp);

    }

}

远程服务类必须有构造器,即使找个构造器什么都不做。而且,构造器必须抛出RemoteException异常。将两个编辑好的源文件存盘,然后编译。对于使用RMI,仅仅编译还不够,还必须使用rmic命令编译服务类,编译服务类是为了生成stub和skeleton——查看存放class文件的地方,多了如下两个class文件:

q      ServerImpl_Stub.class

q      ServerImpl_Skel.class

这两个类就是服务类生成的stub和skeleton。客户端程序面向接口编程,客户端部分需要Server接口的class文件,还需要stub文件。客户端的源代码如下:

public class RMIClient

{

         //主方法,程序入口

    public static void main(String[] args)throws Exception

    {

                   //通过JNDI查找远程服务

           Server ser = (Server)Naming.lookup("rmi://:1099/fdf");

                   //调用远程方法

           System.out.println(ser.helloWorld("yeeku"));

                   //调用远程方法。

           System.out.println(ser.getPerson("yeeku",28));

    }

}

从客户端程序看,无法感受到Server的实现在远端。程序调用Server实例方法时,与平常调用方法只有非常细微的区别:调用远程方法必须抛出RemoteException。

再看远程方法的返回值,helloWorld的返回值是String,而getPerson的返回值则是Person对象。远程方法的返回值必须有一个要求:实现Serializable接口。因为远程的方法的参数、返回值都必须在网络上传输,网络只能传输字节流,因此,要求参数、返回值都可以转换成字节流——即实现序列化。主程序的如下一行代码,用于注册远程服务端口:

LocateRegistry.createRegistry(1099);

1099是RMI服务的默认端口。然后执行如下代码绑定远程服务

Naming.rebind("rmi://:1099/fdf", imp);

客户端使用JNDI查找,查找远程服务名。将远程服务对象类型转换成远程接口类型,客户端面向接口编程。RMI的具体实现,依然是依赖于底层的Socket编程。RMI依赖于TCP/IP传输协议,服务器端skeleton建立ServerSocket监听请求,而客户端建立Socket请求连接。RMI实现了网络传输的多线程、IO等底层细节。这些细节的实现就隐藏在rmic命令的执行中:使用rmic命令编译时生成的两个class文件:

q      stub:该文件用于与客户端交流,建立Socket请求连接。

q      skeleton:该文件用于与服务器端交流,建立ServerSocket监听请求。

RMI的原理示意如图所示。



  • 大小: 27.1 KB
分享到:
评论

相关推荐

    【Java RMI介绍以及编写Demo】

    NULL 博文链接:https://gaojingsong.iteye.com/blog/2341692

    RMI规范 RMI详细介绍

    RMI 规范 RMI 详细介绍 共10章

    java rmi详细介绍介绍

    java rmi详细介绍介绍java rmi详细介绍介绍java rmi详细介绍介绍java rmi详细介绍介绍

    rmi接口技术详细介绍文档

    一份很全的介绍rmi基本原理,以及如何使用rmi,以及使用过程中需要注意的事项,非常不错的文档

    分布式实验报告RMI.docx

    本实验报告主要介绍了 Java RMI(Remote Method Invocation,远程方法调用)的基本概念和实现步骤。RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。 ...

    Weblogic Server与RMI

    Weblogic Server与RMI RMI的使用介绍

    java rmi详细介绍.doc

    java rmi详细介绍

    Spring Rmi使用文档

    Spring Rmi的使用,对Spring RMI进行全访问的介绍,并介绍了其中的源代码部分

    rmi 例子和详细介绍的ppt

    rmi 详细介绍 和 web应用实例(包含rimserver和rmiclient两个工程)

    rmi入门学习,实用的小例子

    描述java rmi的实用方式,有实用简单的入门介绍,很容易理解!!!

    JDK5新版RMI编程指南

    JDK5中,RMI技术已经得到了重大更新。现在使用JDK提供的RMI类,可以相当简单的发布RMI服务! 在JDK5发布之前,使用RMI是一件非常繁琐的事情。甚至很多程序员把EJB... 本文详细介绍了怎样使用JDK5新版的RMI进行开发!

    RMI:远程方法调用(RMI)简介

    RMI介绍该项目最初是作为在2015年秋季的Java课程中在Java中使用RMI的示例项目而编写的。安装$ mvn install$ java -Djava.security.policy=RMI-Server/server.policy -jar RMI-Server/target/RMI-Server-1.0.jar$ ...

    乳化液泵站RMI与KAMAT比较分析

    介绍了目前国内市场占有率较高的KAMAT泵站和RMI泵站的整体结构,从减速系统、液力系统、润滑系统、保护系统、控制系统等方面对其关键技术进行了全面的比较和分析,总结了各自的优缺点,并指出各自的改进方向:对于...

    RMI.rar_rmi

    这是一篇介绍RMI的入门性文档,里面包含了几个简单例子,对于入门有很大的帮助

    JAVA RMI规范

    详细介绍了JAVA RMI 的知识,不可多得的文档。长达60页,很详尽。对于java远程调用和分布式开发很有帮助。

    Java RMI详细介绍及简单实例

    主要介绍了Java RMI详细介绍及简单实例的相关资料,需要的朋友可以参考下

    rmi原理-chn-pdf

    rmi原理介绍及介绍,适合重新温习,中文版pdf

    rmi:RMI - 数据传输

    介绍 该项目允许您操作通过 RMI 分布的对象。 RMI 允许您在多个虚拟机之间共享资源(对象)。 建筑学 UML图 脚本 姓 描述 树_1.sh 模拟一个 6 节点树。 消息由节点 1(根)初始化。 树_2.sh 同上,只是消息由...

Global site tag (gtag.js) - Google Analytics