A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 li745547 于 2018-3-25 13:31 编辑

RMI(Remote Method Invoke)远程方法调用
RMI协议能够让在某个Java虚拟机上的对象,像调用本地对象一样调用另一个Java虚拟机中的对象上的方法。它使用了序列化方式在客户端和服务器端传送数据。RMI是一种被EJB使用的更底层的协议。(stub/skeleton层提供了客户程序和服务程序彼此交互的接口)

一、Java RMI实现

首先新建一个工程,随便什么工程,为了方便,就Java Project吧。

1、创建一个接口,继承Remote

[html] view plain copy


  • package rmi.java;  
  •   
  • import java.rmi.Remote;  
  • import java.rmi.RemoteException;  
  • /**   
  • * 定义远程接口,必须继承Remote接口,   
  • * 其中所有需要远程调用的方法都必须抛出RemoteException异常   
  • */   
  • public interface IHello extends Remote {  
  •       
  •     public String sayHello(String name) throws RemoteException;     
  •     public int sum(int a, int b)throws RemoteException;   
  •   
  •   
  • }  





2、创建接口的实现类

[html] view plain copy


  • package rmi.java;  
  •   
  • import java.rmi.RemoteException;  
  • import java.rmi.server.UnicastRemoteObject;  
  •   
  • public class HelloImpl extends UnicastRemoteObject implements IHello{  
  •       
  •     private static final long serialVersionUID = 1961558474342609777L;  
  •       
  •         public HelloImpl()throws RemoteException {  
  •         super();  
  •     }  
  •   
  •   
  •     @Override  
  •     public String sayHello(String name) {  
  •         return "Hello, " + name;   
  •     }  
  •   
  •   
  •     @Override  
  •     public int sum(int a, int b) {  
  •          
  •         return a+b;  
  •     }  
  •   
  • }  


       说明:接口的实现类同时要实现Serializable接口,这里继承UnicastRemoteObject也是间接实现Serializable接口,同时,因为构造方法需要抛出RemoteException,所以不能缺省使用隐含的无参构造方法,而应该自己显式定义构造方法。


3、创建应用类,注册和启动服务端RMI,以被客户端调用

[html] view plain copy


  • package rmi.java;  
  •   
  • import java.net.MalformedURLException;  
  • import java.rmi.AlreadyBoundException;  
  • import java.rmi.Naming;  
  • import java.rmi.RemoteException;  
  • import java.rmi.registry.LocateRegistry;  
  •   
  •   
  • public class HelloServer {  
  •     public static void main(String args[]) {  
  •         try {  
  •             //创建一个远程对象  
  •             IHello rhello = new HelloImpl();      
  •             //生成远程对象注册表Registry的实例,并指定端口为8888(默认端口是1099)  
  •             LocateRegistry.createRegistry(8888);  
  •   
  •             //把远程对象注册到RMI注册服务器上,并命名为RHello  
  •             //绑定的URL标准格式为:rmi://host:port/name(协议名可以省略,下面两种写法都可以)  
  •             Naming.bind("rmi://127.0.0.1:8888/RHello", rhello);  
  •          
  •             System.out.println(">>INFO:远程IHello对象绑定成功!");  
  •         } catch (RemoteException e) {  
  •             System.out.println("创建远程对象发生异常!");  
  •             e.printStackTrace();  
  •         } catch (AlreadyBoundException e) {  
  •             System.out.println("发生重复绑定对象异常!");  
  •             e.printStackTrace();  
  •         } catch (MalformedURLException e) {  
  •             System.out.println("发生URL畸形异常!");  
  •             e.printStackTrace();  
  •         }  
  •     }  
  • }  


      说明:绑定的地址10.225.112.86是我的局域网地址可以在DOS命令行用ipconfig查看,如果你的机器没有任何联网,可以使用127.0.0.1或localhost。

      运行HelloServer.java看到,红色方块显示正在运行:

       >>INFO:远程IHello对象绑定成功!

好了,现在远程服务提供端建立完成,下面建立客户端。

新建一个新的工程,为了方便,也是Java Project吧,

1、 因为客户端需要有服务端那边提供的接口,才可以访问,所以要将服务端的IHello接口完全拷贝(连同包)到客户端,当然为了方便,你在客户端工程中新建一个完全一样的接口也可以。实际运用中通常是要服务端接口打成jar包来提供的。

2、 创建客户端调用类

[html] view plain copy


  • package rmi.java;  
  •   
  • import java.rmi.Naming;  
  •   
  •   
  • public class HelloClient {  
  •     public static void main(String args[]) {  
  •         try {  
  •             // 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法  
  •             IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8888/RHello");  
  •             System.out.println(rhello.sayHello("world"));  
  •             System.out.println(rhello.sum(454, 5457));  
  •         } catch (Exception e) {  
  •             e.printStackTrace();  
  •         }  
  •     }  
  • }  




       运行,成功。

       下面我们要使用Spring封装的Java RMI技术,也是很多项目都会用到的。后面我有个Spring RMI的例子。要看懂下面Spring的例子,你需要已经会用Spring,会配置Spring,否则怕你看不懂,所以如果还不懂Spring的,先学学Spring,入下门吧。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马