`
至尊宝_唯一
  • 浏览: 1931 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

RMI例子

 
阅读更多

对RMI知识做个总结,顺便练习自己的博客水平。

RMI的总结规划如下:1  一个简单的RMI例子   2 一个简单的Sping-remoting RMI例子  3 给出一个使用注解减少RMI配置的一个例子  4  简单分析Spring-remoting RMI的源码  5 简单分析下RMI的Registry,Naming,Activation Framework等。需要注意的是给出的例子基于JDK5.0+,不使用rmic编译器。

第一篇:一个简单的RMI 例子
定义:RMI是RPC的JAVA实现,服务提供者和服务使用者都必须是JAVA实现。RMI使用序列化机制通过Socket进行信息的传递。关于RMI的QoS在后面会有简单的讨论。

 

应用层工作模型(仅限于Registry机制,不考虑Activation):

  • 服务提供者(RemoteObject)
  • 服务映射和暴露策略(Naming Service和Registry)
  • 服务使用者(RemoteRef)

服务提供者就是提供远程服务的对象,在代码中表现为接口及其实现类,请看下面代码:

 

package com.neil.server.service;

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

/**
 * 服务接口必须extends Remote
 * @author nei.zhang
 * 
 */
public interface IAccountService extends Remote
{
    /**
     * 接口方法必须throws RemoteException
     */
    int account(int a, int b)
        throws RemoteException;
    
}





package com.neil.server.service.impl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import com.neil.server.service.IAccountService;

/**
 * 
 * @author nei.zhang 实现类必须
 */
public class AccountServiceImpl extends UnicastRemoteObject implements IAccountService
{
    
    public AccountServiceImpl()
        throws RemoteException
    {
        super();
    }
    
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    
    public int account(int a, int b)
        throws RemoteException
    {
        // 简单返回result
        return a + b;
    }
    
    // 可以订制序列化
    
}

 

 

 

服务映射和暴露策略是把对象注册到指定的Registry。RMI中的Registry可以简单理解成key-value的字典。key是serviceName,value是一个RemoteRef即一个服务对象(serviceObject)的引用。具体请看代码:

 

package com.neil.server.core;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

import com.neil.server.service.IAccountService;
import com.neil.server.service.impl.AccountServiceImpl;

/**
 * 完成server的注册,暂时不考虑SecurityManager
 * @author nei.zhang
 * 
 */
public class StartupServer
{
    public static void main(String[] args)
        throws Exception
    {
        
        LocateRegistry.createRegistry(1099);
        
        IAccountService accountService = new AccountServiceImpl();
        
        // 绑定service,这里写死了IP,在生产环境下需要注意是IP和机器名的对应关系,否则容易见到常见的Connection refused异常
        Naming.rebind("//192.168.1.254:1099/accountService", accountService);
        
        //请原谅这个sysout
        System.out.println("bind service successful!");
        
        while (true)
        {
            // 占用CPU
        }
        
    }
}

 

 

 

服务使用者可以理解成就是客户端。使用者无法感知远程对象的存在。使用者是通过Registry去获取一个RemoteRef,然后进行相应的业务逻辑操作。使用例子可以看如下的代码:

 

package com.neil.client;

import java.rmi.Naming;

import com.neil.server.service.IAccountService;

/**
 * client端启动类
 * 
 * @author nei.zhang
 * 
 */
public class StartupClient
{
    public static void main(String[] args)
        throws Exception
    {
        
        IAccountService accountService = (IAccountService)Naming.lookup("//192.168.1.254:1099/accountService");
        
        System.out.println("result is :" + accountService.account(1, 2));
        
    }
}

 

 

部署即可运行。需要注意的是安全策略需要全部允许。可以在服务提供者的启动参数中加上-Djava.security.policy=java.security.AllPermission

 

总结如下:

RMI实现在应用层可以理解为:编写远程服务接口及实现---->注册发布服务对象---->获取远程对象引用进行业务操作。

 

扩展:前文特别注明例子是使用JDK5.0+环境不需要使用rmic编译器,而在经典的RMI例子中都会提到Stub和Skeleton。现在引入这两个概念。

存在位置:

Skeleton:服务提供者前端,可以简单理解为ServerSocket持有者

Stub:服务使用者前端,可以简单理解为客户端的Socket持有者

为了清晰,直接上图:



以上就是简单的RMI的一个例子。下一篇准备讲讲Stub和Skeletion以及动态下载机制。

 

以上请各位斧正。

 

 

 

 

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

相关推荐

    Java RMI实例

    Java RMI实例

    一个RMI实例

    这个“一个RMI实例”显然是一个供初学者使用的示例项目,可以帮助理解RMI的基本原理和操作流程。 在RMI中,主要有以下几个核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它继承自java...

    java RMI 例子

    通过学习和实践这个RMI例子,我们可以深入理解Java的分布式编程能力,这对于开发大型企业级应用或者分布式系统来说是非常有价值的。同时,了解RMI的工作原理也有助于我们更好地掌握其他类似技术,如JDBC、JNDI等。

    dwr实例操作+rmi实例操作

    通过DWR和RMI的实例操作,我们可以构建出一个具有动态交互特性的Web应用,其中DWR负责前端与后端的异步通信,而RMI则处理后台的分布式计算和数据交换。这两个技术的结合可以为复杂的Web应用提供高效且灵活的解决方案...

    rmi的实例rmi的实例rmi的实例

    下面将详细阐述RMI的实例及其用法。 **1. RMI的基本概念** RMI的核心理念是对象的远程调用,它通过序列化和反序列化机制,将远程对象的方法调用转化为网络通信。在RMI中,主要有三个关键角色:远程接口(Remote ...

    一个简单的RMI例子Java源代码,用于学习理解RMI

    这个"一个简单的RMI例子Java源代码"是为了帮助开发者更好地理解和应用RMI。 RMI的核心概念包括: 1. **远程接口(Remote Interface)**:这是定义远程方法的Java接口。它声明了客户端可以调用的那些方法,这些方法...

    中间件实验(rmi实例)

    中间件实验(RMI 实例)是 Java RMI(Remote Method Invocation,远程方法调用)的实验报告,旨在通过实验了解 Java RMI 的机制和开发流程。本实验报告主要介绍了 RMI 的基本概念、实验步骤、实验结果和结论分析等...

    RMI 例子

    ### 简单RMI例子 这个例子的代码可能包括以下部分: 1. **定义远程接口**: ```java public interface MyRemoteInterface extends Remote { String doSomething(String input) throws RemoteException; } ``` 2....

    JAVARMI实例[文].pdf

    在Java RMI实例中,我们通常会经历以下几个步骤: 1. **创建远程接口**:首先,我们需要定义一个远程接口,这个接口需要扩展`java.rmi.Remote`。远程接口中的所有方法都需要抛出`RemoteException`,这是因为远程...

    简单的rmi实例下载

    这个简单的RMI实例可能是为了帮助初学者理解RMI的基本工作原理和实现步骤。 RMI的核心概念是客户端和服务端。服务端通过RMI注册一个远程接口,该接口定义了可供客户端调用的方法。客户端则通过RMI机制获取到服务端...

    一个简单的RMI实例

    这个“简单的RMI实例”演示了如何在不依赖像Tomcat这样的Web服务器的情况下实现RMI。下面我们将深入探讨RMI的基本概念、配置过程以及如何创建和运行这个实例。 ### RMI基本概念 1. **远程对象(Remote Object)**:...

    Java分布式之RMI实例教程

    ### Java分布式之RMI实例教程知识点详解 #### 一、RMI基础知识介绍 **RMI (Remote Method Invocation)** 是一种Java技术,用于实现分布式应用程序之间的远程过程调用。通过RMI,开发者可以在不同的JVM之间调用方法...

    最最简单的RMI实例

    本实例将引导我们理解RMI的基本概念和实现步骤。 RMI的核心是提供一种跨网络的分布式计算能力,使得一台计算机上的程序能够像调用本地对象一样调用另一台计算机上的对象。这在多层架构的应用中尤其有用,比如服务器...

    rmi实例详解

    【RMI实例详解】 远程方法调用(RMI,Remote Method Invocation)是Java JDK 1.1引入的一种分布式对象技术,旨在简化分布在不同环境下的Java应用程序间的通信。RMI允许对象在不同的Java虚拟机(JVM)之间进行交互,...

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    rmi实例(Spring整合)

    **标题:“RMI实例(Spring整合)”** 远程方法调用(Remote Method Invocation,简称RMI)是Java中的一种机制,允许一个Java对象在某个Java虚拟机(JVM)上执行另一个Java对象的方法,即使该对象位于不同的网络...

    rmi 例子和详细介绍的ppt

    在Web应用实例中,RMI可以作为服务层和表现层之间的通信机制。例如,`rimserver`可能是一个部署在Web服务器上的Java应用,提供RMI服务,而`rmiclient`则是一个调用这些服务的客户端应用。客户端可能是一个Web页面,...

    分布式调用RMI例子程序

    在这个"分布式调用RMI例子程序"中,我们主要关注的是如何使用RMI技术来创建和运行一个简单的分布式应用。 RMI的核心概念包括远程接口、远程对象和RMI注册表。首先,远程接口定义了可以在远程服务器上执行的方法,...

Global site tag (gtag.js) - Google Analytics