Java RMI远程调用的案例

  介绍

这篇文章主要介绍Java RMI远程调用的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

我们先来看看Java RMI的定义:

RMI(远程方法调用,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力. Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统,而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI远程调用步骤

RMI的交互图:

癑ava

RMI由3个部分构成,第一个是rmiregistry (JDK提供的一个可以独立运行的程序,在本目录下),第二个是服务器端的程序,对外提供远程对象,第三个是客户端的程序,想要调用远程对象的方法。
首先,先启动rmiregistry服务,启动时可以指定服务监听的端口,也可以使用默认的端口(1099)。
其次,服务器端在本地先实例化一个提供服务的实现类,然后通过RMI提供的命名/背景/注册表(下面实例用的注册表)等类的绑定或重新绑定方法将刚才实例化好的实现类注册到rmiregistry上并对外暴露一个名称。
最后,客户端通过本地的接口和一个已知的名称(即rmiregistry暴露出的名称)再使用RMI提供的命名/背景/注册表等类的查询方法从RMIService那拿到实现类。这样虽然本地没有这个类的实现类,但所有的方法都在接口里了,便可以实现远程调用对象的方法了。

存根和骨干网的具体通信过程:

癑ava

方法调用从客户对象经存根(存根),远程引用层(远程参考层)和传输层(传输层)向下,传递给主机,然后再次经传输层,向上穿过远程调用层和骨干网(骨架),到达服务器对象。
存根扮演着远程服务器对象的代理的角色,使该对象可被客户激活。
远程引用层处理语义,管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。
传输层管理实际的连接,并且追踪可以接受方法调用的远程对象。
骨干网完成对服务器对象实际的方法调用,并获取返回值。
返回值向下经远程引用层,服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,存根获得返回值。

Java RMI简单示例

本示例是客户端调用服务器端远程对象的加减法方法,具体步骤为:
1。定义一个远程接口

import  java.rmi.Remote;   import  java.rmi.RemoteException;/* *   ,*必须继承远程接口。   ,*所有参数和返回类型必须序列化(因为要网络传输)。   ,*任意远程对象都必须实现此接口。   ,*只有远程接口中指定的方法可以被调用。   ,*/public  interface  IRemoteMath  extends  Remote  {//,所有方法必须抛出RemoteException   public  double 添加(double ,, double  b), throws  RemoteException异常;   public  double 减去(double ,, double  b), throws  RemoteException异常;      }

(学习视频分享:java视频教程)

2。远程接口实现类

import  java.rmi.RemoteException;   import  java.rmi.server.UnicastRemoteObject;   import  remote.IRemoteMath;/* *   ,*服务器端实现远程接口。   ,*必须继承UnicastRemoteObject,以允许JVM创建远程的存根/代理。   ,*/public  class  RemoteMath  extends  UnicastRemoteObject  implements  IRemoteMath  {      private  int  numberOfComputations;      protected  RemoteMath (), throws  RemoteException  {   时间=numberOfComputations  0;   }      @Override   public  double 添加(double ,, double  b), throws  RemoteException  {   numberOfComputations + +;   System.out.println (“Number  of  computations  performed  so  far =,,,   +,numberOfComputations);   return  (a + b);   }      @Override   public  double 减去(double ,, double  b), throws  RemoteException  {   numberOfComputations + +;   System.out.println (“Number  of  computations  performed  so  far =,,,   +,numberOfComputations);   return  (a - b);   }      }

Java RMI远程调用的案例