基于RMI实现远程调用的系统间通信

在Java中实现远程调用方式的技术主要有RMI和WebService两种,下面分别来看看基于RMI技术如何实现远程调用方式的系统间通信。

RMI

RMI(Remote Method Invocation)是Java用于实现透明远程调用的重要机制。在远程调用中,客户端仅有服务器端提供的接口。通过此接口实现对远程服务器端的调用。

远程调用基于网络通信来实现,RMI同样如此,其机制如图1.1所示:

 
(点击查看大图)图1.1  RMI机制

Sun JDK 6.0以前版本中的RMI实现均是基于TCP/IP+BIO方式的,RMI服务器端通过启动RMI注册对象在一个端口上监听对外提供的接口,其实现实例以字符串的方式绑定到RMI注册对象上。RMI客户端通过proxy的方式代理了对服务器端接口的访问,RMI客户端将要访问的服务器端对象字符串、方法和参数封装成一个对象,序列化成流后通过TCP/IP+BIO传输到RMI服务器端。RMI服务器端接收到客户端的请求对象后,解析其中的对象字符串、方法及参数,通过对象字符串从RMI注册对象上找到提供业务功能的实例,之后结合要访问的方法来反射获取到方法实例对象,传入参数完成对服务器端对象实例的调用,返回的结果则序列化为流以TCP/IP+BIO方式返回给客户端,客户端在接收到此流后反序列化为对象,并返回给调用者。

RMI要求服务器端的接口继承Remote接口,接口上的每种方法必须抛出RemoteException,服务器端业务类通过实现此接口提供业务功能,然后通过调用UnicastRemoteObject.exportObject来将此对象绑定到某端口上,最后将此对象注册到本地的 LocateRegistry上,此时形成一个字符串对应于对象实例的映射关系。基于RMI实现示例中的服务器端代码如下。

 
 
  1. 服务器端对外提供的接口  
  2. public interface Business extends Remote{  
  3.  
  4.         public String echo(String message) throws RemoteException;  
  5.  
  6. }  
  7. 服务器端实现此接口的类  
  8. public class BusinessImpl implements Business {  
  9.  
  10.     public String echo(String message) throws RemoteException {  
  11.         if("quit".equalsIgnoreCase(message.toString())){  
  12.             System.out.println("Server will be shutdown!");  
  13.             System.exit(0);  
  14.         }  
  15.         System.out.println("Message from client:"+message);  
  16.         return "Server response:"+message;  
  17.     }  
  18.  
  19. }  
  20. 基于RMI的服务器端  
  21. public class Server {  
  22.  
  23.     public static void main(String[] args) throws Exception{  
  24.         int port=9527;  
  25.         String name="BusinessDemo";  
  26.         Business business=new BusinessImpl();  
  27.         UnicastRemoteObject.exportObject(business, port);  
  28.         Registry registry=LocateRegistry.createRegistry(1099);  
  29.         registry.rebind(name, business);  
  30.     }  
  31.  

RMI的客户端首先通过LocateRegistry.getRegistry来获取Registry对象,然后通过 Registry.lookup字符串获取要调用的服务器端接口的实例对象,最后以接口的方式透明地调用远程对象的方法。按照以上描述,基于RMI实现客户端的关键代码如下:

 
 
  1. Registry registry=LocateRegistry.getRegistry("localhost");  
  2.     String name="BusinessDemo";  
  3. // 创建BusinessDemo类的代理类,当调用时则调用 localhost:1099上名称为BusinessDemo的对象,如服务 器端没有对应名称的绑定,则抛出NotBoundException;如 通信出现错误,则抛出RemoteException  
  4. Business business=(Business) registry.lookup(name); 

从上面示例代码来看,基于RMI实现的客户端和服务端较之基于TCP/IP+NIO等实现的客户端和服务端简单很多,代码可维护性也高很多。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值