RMI

1、概述

    1.1  RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上;

    1.2  RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本;

           传统RPC并不能很好地应用于分布式对象系统;

           Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用;

 

2、实例

 

    ===========Server

复制代码
package com.an.rmi.server;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * RMI要求服务器端的接口继承Remote接口,
 * 接口上的每种方法必须显式抛出RemoteException
 */
public interface Business extends Remote {
  String echo(String message)throws RemoteException;
}
复制代码

 

复制代码
package com.an.rmi.server;

import java.rmi.RemoteException;

/**
 * 服务器端业务类通过实现服务器端接口提供业务功能
 */
public class BusinessImpl implements Business {

  public String echo(String message) throws RemoteException {
    if ("quit".equalsIgnoreCase(message.toString())){
      System.out.println("Server will be shutdown");
      System.exit(0);
    }
    System.out.println("Message from client:"+message);
    return "Server response:"+message;
  }
}
复制代码

 

复制代码
package com.an.rmi.server;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

/**
 * jdk1.6之前的RMI实现基于TCP/IP+BIO的方式
 *
 * RMI服务器端通过启动RMI注册对象在一个端口上监听对外提供的接口,
 * 该接口的实现实例通过字符串的方式绑定到RMI注册对象上
 *
 * RMI客户端通过proxy方式代理了对服务器端接口的访问
 *
 * RMI客户端将要访问的  服务器端的对象字符串、方法、参数  封装成一个对象,
 * 序列化成流后通过TCP/IP+BIO传输到RMI服务器端
 *
 * 服务器端接收到客户端的请求对象后,解析其中的对象字符串、方法、参数,
 *
 * 通过对象字符串  从RMI注册对象上找到提供业务功能的实例
 *
 * 结合要访问的方法来反射获取到方法的实例对象,传入参数完成对服务器对象实例的调用
 *
 * 返回的结果则序列化为流以TCP/IP+BIO方式返回给客户端
 *
 * 客户端接收到此流后反序列化成对象,给调用者使用
 *
 * **************************使用*****************************
 *
 * 调用UnicastRemoteObject.exportObject将实现服务器端接口对象绑定到某端口上
 *
 * 将此对象注册到本地的LocateRegister上,此时形成一个字符串对应于对象实例的映射关系
 */
public class Server {

  public static void main(String[] args)throws Exception{
    int port=9527;
    String name="Business Demo";
    Business business=new BusinessImpl();
    UnicastRemoteObject.exportObject(business,port);
    Registry registry =LocateRegistry.createRegistry(1099);
    registry.rebind(name,business);
  }

}
复制代码

 

    ==================Client

复制代码
package com.an.rmi.client;

import com.an.rmi.server.Business;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

/**
 ****************使用*****************
 *
 * RMI客户端通过LocateRegistry.getRegistry来获取Registry对象
 *
 * 通过registry.lookup字符串获取要调用的服务器端接口的实例对象
 */
public class Client {
  public static void main(String[] args)throws Exception{
    Registry registry =LocateRegistry.getRegistry("127.0.0.1");
    String name="Business Demo";
    Business business =(Business) registry.lookup(name);
    business.echo("hello111");
  }
}
复制代码

 

posted on   anpeiyong  阅读(169)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示