JAVA RMI分布式原理和应用

        RMI(Remote Method Invocation)是JAVA早期版本(JDK 1.1)提供的分布式应用解决方案,它作为重要的API被广泛的应用在EJB中。随着互联网应用的发展,分布式处理任务也随之复杂起 来,WebService也得到普遍的推广和应用。
        在某些方面,例如跨语言平台的分布式应用,RMI就显得力不从心了。在实际的应用中,是采用WebService还是传统的RMI来实现?这是一个需要权衡的问题,两者的比较如下所述:

        1. 比起WebService,它只能使用(调用)由JAVA编写的远程服务。而WebService是跨语言平台的,只要客户端和服务端双方都遵守SOAP规范即可;
        2. 
RMI是在TCP协议基础上传递可序列化的java对象(字节数据),而WebService是在HTTP协议基础上通过XML来传输数据的。因此,在同等业务数据量的前提下,RMI的效率要高于WebService。
        因此,RMI可以用在业务结构比较简单,而要求实时高效的分布式应用中。 
        从设计角度上讲,JAVA采用的是三层结构模式来实现RMI。在整个体系结构中,有如下几个关键角色构成了通信双方:
        1.客户端:
           1)
桩(StubObject):远程对象在客户端上的代理;
 
          2)远程引用层(RemoteReference Layer):解析并执行远程引用协议;
           3)传输层
(Transport):发送调用、传递远程方法参数、接收远程方法执行结果。
        2.服务端:
           1)
骨架(Skeleton):读取客户端传递的方法参数,调用服务器方的实际对象方法,并接收方法执行后的返回值;
 
          2)远程引用层(Remote ReferenceLayer):处理远程引用语法之后向骨架发送远程方法调用;
           3)
传输层(Transport):监听客户端的入站连接,接收并转发调用到远程引用层。
        3.注册表(Registry):
以URL形式注册远程对象,并向客户端回复对远程对象的引用。



图1 RMI三层模型 

 

        在实际的应用中,客户端并没有真正的和服务端直接对话来进行远程调用,而是通过本地JVM环境下的桩对象来进行的。
       
1.远程调用过程:
        
1)客户端从远程服务器的注册表中查询并获取远程对象引用。当进行远程调用时,客户端首先会与桩对象(Stub Object)进行对话,而这个桩对象将远程方法所需的参数进行序列化后,传递给它下层的远程引用层(RRL);
        2)
桩对象与远程对象具有相同的接口和方法列表,当客户端调用远程对象时,实际上是由相应的桩对象代理完成的。远程引用层在将桩的本地引用转换为服务器上对象的远程引用后,再将调用传递给传输层(Transport),由传输层通过TCP协议发送调用;     
        3)在服务器端,传输层监听入站连接,它一旦接收到客户端远程调用后,就将这个引用转发给其上层的远程引用层;
        4
)服务器端的远程引用层将客户端发送的远程应用转换为本地虚拟机的引用后,再将请求传递给骨架(Skeleton);
        5)
骨架读取参数,又将请求传递给服务器,最后由服务器进行实际的方法调用。
        2.
结果返回过程:
        1)
如果远程方法调用后有返回值,则服务器将这些结果又沿着“骨架->远程引用层->传输层”向下传递;
        2)
客户端的传输层接收到返回值后,又沿着“传输层->远程引用层->桩”向上传递,然后由桩来反序列化这些返回值,并将最终的结果传递给客户端程序。
        又从技术的角度上讲,有如下几个主要类或接口扮演着上述三层模型中的关键角色:
        1)
注册表:java.rmi.Naming和ava.rmi.Registry;
        2)
骨架:java.rmi.remote.Skeleton       
        3)
桩:java.rmi.server.RemoteStub
        4)远程引用层:
java.rmi.server.RemoteRef和sun.rmi.transport.Endpoint;
        5)传输层:sun.rmi.transport.
Transport

        作为一般的RMI应用,JAVA为我们隐藏了其中的处理细节,而让开发者有更多的
精力和时间花在实际的应用中。开发RMI的步骤如下所述: 
        1.服务端:
        1)
定义Remote子接口,在其内部定义要发布的远程方法,并且这些方法都要Throws RemoteException;
        2)
定义远程对象的实现类,通常有两种方式:
             
a. 继承UnicastRemoteObject或Activatable,并同时实现Remote子接口;
               b. 
只实现Remote子接口和java.io.Serializable接口。
        3)
编译桩(在JAVA 1.5及以后版本中,如果远程对象实现类继承了UnicastRemoteObject或Activatable,则无需此步,由JVM自动完成。否则需手工利用rmic工具编译生成此实现类对应的桩类,并放到和实现类相同的编译目录下);
        4)
启动服务器:依次完成注册表的启动和远程对象绑定。另外,如果远程对象实现类在定义时没有继承UnicastRemoteObject或Activatable,则必须在服务器端显示的调用UnicastRemoteObject类中某个重载的exportObject(Remote remote)静态方法,将此实现类对象导出成为一个真正的远程对象。
        2.客户端:
       1)定义用于接收远程对象的
Remote子接口,只需实现java.rmi.Remote接口即可。但要求必须与服务器端对等的Remote子接口保持一致,即有相同的接口名称、包路径和方法列表等。
       2)
通过符合JRMP规范的URL字符串在注册表中获取并强转成Remote子接口对象;
       3)
调用这个Remote子接口对象中的某个方法就是为一次远程方法调用行为。

        下面结合一个例子来说明RMI分布式应用的开发步骤。
        背景:远程系统管理接口SystemManager允许客户端远程调用其内部的某个方法,来获取服务器环境下某个属性的值。因此,第一步需要在服务端和与之通信的客户端环境下,定义一个完全一样的
SystemManager接口,将此接口标记为远程对象。

 

1.在服务端和客户端定义对等Remote子接口(SystemManager)

 

package com.daniele.appdemo.rmi;

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

import com.daniele.appdemo.test.domain.User;

/**
 * <p>系统管理远程对象接口</p>
 * @author  <a href="mailto:code727@gmail.com">Daniele</a>
 * @version 1.0.0, 2013-5-21
 * @see    
 * @since   AppDemo1.0.0
 */
public interface SystemManager extends Remote {
   
    /**
     * <p>发布的远程对象方法一:获取所有系统环境信息</p>
     * @author <a href="mailto:code727@gmail.com">Daniele</a>
     * @return
     * @throws RemoteException
     * @since AppDemo1.0.0
     */
    public String getAllSystemMessage() throws RemoteException;
   
    /**
     * <p>发布的远程对象方法二:获取指定的系统环境信息</p>
     * @author <a href="mailto:code727@gmail.com">Daniele</a>
     * @param properties:环境信息对应的属性名,多个名之间用逗号隔开
     * @return
     * @throws RemoteException
     * @since AppDemo1.0.0
     */
    public String getSystemMessage(String properties) throws RemoteException;
}

 

2.在服务端定义Remote子接口的实现类(SystemManagerImpl),即远程对象的实际行为逻辑。

 

package com.daniele.appdemo.rmi.server;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.RemoteServer;
import java.rmi.server.ServerNotActiveException;

import org.apache.log4j.Logger;

import com.daniele.appdemo.rmi.SystemManager;
import com.daniele.appdemo.test.domain.User;
import com.daniele.appdemo.util.SystemUtils;

/**
 * <p>
 *         系统管理远程对象实现类。有两种实现方式:
 *      1.继承UnicastRemoteObject或Activatable,并同时实现Remote子接口
 *      2.只实现Remote子接口,这种方式灵活但比较复杂:
 *        1)要求此实现类必须实现java.io.Serializable接口;
 *        2)通过这种方式定义的实现类此时还不能叫做远程对象实现类,
 *          因为在服务器端绑定远程对象之前,还需要利用JDK提供的rmic工具
 *          将此实现类手工编译生成对应的桩实现类,并放到和它相同的编译目录下。
 * </p>
 * @author  <a href="mailto:code727@gmail.com">Daniele</a>
 * @version 1.0.0, 2013-5-21
 * @see    
 * @since   AppDemo1.0.0
 */
public class SystemManagerImpl implements SystemManager, Serializable {
   
//public class SystemManagerImpl extends UnicastRemoteObject implements SystemManager {
   
    private static final long serialVersionUID = 9128780104194876777L;
   
    private static final Logger logger = Logger.getLogger(SystemManagerImpl.class);
   
    private static SystemManagerImpl systemManager = null;

    /**
     * <p>在服务端本地的匿名端口上创建一个用于监听目的的UnicastRemoteObject对象</p>
     * @author <a href="mailto:code727@gmail.com">Daniele</a>
     * @throws RemoteException
     * @since AppDemo1.0.0
     */
    private SystemManagerImpl() throws RemoteException {
        super();
        // 在控制台中显示远程对象被调用,以及返回结果时产生的日志
        RemoteServer.setLog(System.out);
    }
   
    public static SystemManagerImpl getInstance() throws RemoteException {
        if (systemManager == null) {
            synchronized (SystemManagerImpl.class) {
                if (systemManager == null)
                    systemManager = new SystemManagerImpl();
            }
        }
        return systemManager;
    }

    public String getAllSystemMessage() throws RemoteException {
        try {
            /*
             * getClientHost()方法可以获取触发当前远程方法被调用时的客户端的主机名。
             * 在远程服务端的环境中,如果当前线程实际上没有运行客户端希望调用的远程方法时,
             * 则会抛出ServerNotActiveException。
             * 因此,为了尽量避免这个异常的发生,它通常用于远程方法的内部实现逻辑中,
             * 以便当此方法真正的被调用时,可以记录下哪个客户端在什么时间调用了这个方法。
             */
                logger.info("Client {" + RemoteServer.getClientHost() + "} invoke method [getAllSystemMessage()]" );
            } catch (ServerNotActiveException e) {
                e.printStackTrace();
            }
        return SystemUtils.formatSystemProperties();
    }

    public String getSystemMessage(String properties) throws RemoteException {
        try {
            logger.info("Client {"
                    + RemoteServer.getClientHost()
                    + "} invoke method [getAllSystemMessage(String properties)]");
             } catch (ServerNotActiveException e) {
                e.printStackTrace();
            }
        return SystemUtils.formatSystemProperties(properties.split(","));
    }

}

 

 3.由于SystemManagerImpl 不是通过继承UnicastRemoteObject 或 Activatable来实现的,因此在服务器端需要利用JDK提供的rmic工具编译生成对应的桩类。否则,此步略过。例如,在Windows环境下打开命令控制台后  
1)进入工程根目录 :
   
         cd d:\ Development\AppDemo
2)
桩编译: 
         cmic -classpath WebContent\WEB-INF\classes com.daniele.appdemo.rmi.server.SystemManagerImpl
   语法格式为:
    cmic -classpath <远程对象实现类bin目录的相对路径> 
<远程对象实现类所在的包路径>.<远程对象实现类的名称>
       完成后,rmic将在相对于根目录的com\daniele\appdemo\rmi\server子目录中自动生成SystemManagerImpl_Stub桩对象类 (即“远程对象实现类名称_Stub”) 的编译文件,此时需要再将此编译文件拷贝到与远程对象实现类SystemManagerImpl相同的编译目录(\WebContent\WEB-INF\classes\com\daniele\appdemo\rmi\server)中,否则在服务器端发布远程对象时将会抛出java.rmi.StubNotFoundException。如下图所示。

 


图2 实现类与桩 

 

   需要特别注意的是:如果服务端中的远程对象实现类存在有对应的桩对象类编译文件,则要求在RMI客户端的环境中,也必须有这个对等的桩对象类编译文件,即意味着这个文件在两端有着相同的包路径、文件名和内部实现细节。因此,最简单的做法就是连同整个包(com\daniele\appdemo\rmi\server)在内,将图2中的SystemManagerImpl_Stub.class文件拷贝到RMI客户端工程的bin目录下即可。如下图。否则,当RMI客户端调用远程服务时将会抛出java.rmi.StubNotFoundException。

 

图3 RMI客户端工程下的对等桩文件
 

 

4.创建用于发布远程对象目的用的服务器(SystemManagerServer)

 

package com.daniele.appdemo.rmi.server;

import java.io.IOException;
import java.util.Arrays; 
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

import org.apache.log4j.Logger;

import com.daniele.appdemo.rmi.SystemManager;

/**
 * <p>
 *         系统管理远程服务器,它主要完成如下任务:
 *      1.在绑定之前先启动注册表服务。
 *         2.将远程对象SystemManager绑定到注册表中,以便让客户端能远程调用这个对象所发布的方法;
 * </p> 
 * @author  <a href="mailto:code727@gmail.com">Daniele</a>
 * @version 1.0.0, 2013-5-21
 * @see     
 * @since   AppDemo1.0.0
 */
public class SystemManagerServer {
    
    private static final Logger logger = Logger.getLogger(SystemManagerServer.class);
    
    public static void main(String[] args) {
        try {
            
                SystemManager systemManager = SystemManagerImpl.getInstance();
            
                /*
                 *  如果远程对象实现类不是通过继承UnicastRemoteObject或Activatable来定义的,
                 *  则必须在服务器端显示的调用UnicastRemoteObject类中某个重载的exportObject(Remote remote)静态方法,
                 *  将此实现类的某个对象导出成为一个真正的远程对象。否则,此步省略。
                 */
                UnicastRemoteObject.exportObject(systemManager);
               
                int port = 9527;
                String url = "rmi://localhost:" + port + "/";
                String remoteObjectName = "systemManager";

                /*
                 *  在服务器的指定端口(默认为1099)上启动RMI注册表。
                 *  必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上。
                 */
                LocateRegistry.createRegistry(port);
            
                /*
                 *  将指定的远程对象绑定到注册表中:
                 *  1.如果端口号不为默认的1099,则绑定时远程对象名称中必须包含Schema,
                 *    即"rmi://<host或ip><:port>/"部分,并且Schema里指定的端口号应与createRegistry()方法参数中的保持一致
                 *  2.如果端口号为RMI默认的1099,则远程对象名称中不用包含Schema部分,直接定义名称即可
                 */
                if (port == 1099)
                    Naming.rebind(remoteObjectName, systemManager);
                else
                    Naming.rebind(url + remoteObjectName, systemManager);
               logger.info("Success bind remote object " + Arrays.toString(Naming.list(url)));
            } catch (IOException e) {
                e.printStackTrace();
            }
      }
    
} 

 

 5.创建发出远程调用请求的客户端(SystemManagerClient)

 

package com.daniele.appdemo.rmi.client;

import java.io.IOException;
import java.rmi.Naming;
import java.rmi.NotBoundException;

import com.daniele.appdemo.rmi.SystemManager;
import com.daniele.appdemo.test.domain.User;

/**
 * <p>系统管理进行远程调用的客户端</p> 
 * @author  <a href="mailto:code727@gmail.com">Daniele</a>
 * @version 1.0.0, 2013-5-21
 * @see     
 * @since   AppDemo1.0.0
 */

public class SystemManagerClient {

    public static void main(String[] args) {
        /*
         * RMI URL格式:Schame/<远程对象名>
         * 1.Schame部分由"rmi://<server host或IP>[:port]"组成,
         *   如果远程对象绑定在服务端的1099端口(默认)上,则port部分可以省略,否则必须指定。
         * 2.URL最后一个"/"后面的值为远程对象绑定在服务端注册表上时定义的远程对象名,
         *   即对应Naming.rebind()方法第一个参数值中最后一个"/"后面的值
         */
        String rmi = "rmi://192.168.1.101:9527/systemManager";
        try {
                /*
                 * 根据URL字符串查询并获取远程服务端注册表中注册的远程对象,
                 * 这里返回的是本地实现了Remote接口的子接口对象(Stub),
                 * 它与服务端中的远程对象具有相同的接口和方法列表,因而作为在客户端中远程对象的一个代理。
                 */
                SystemManager systemManager = (SystemManager) Naming.lookup(rmi);
         
//              System.out.println(systemManager.getAllSystemMessage());
                System.out.println(systemManager.getSystemMessage("java.version,os.name"));
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NotBoundException e) {
                e.printStackTrace();
            }
    }

}

 完成后,再依次到服务器和客户端上启动SystemManagerServer和SystemManagerClient即可。

 

 

一个RMI的分布式应用的实例 Java是一门简单而且实用的语言(高级语言) 花些时间去学习是值得的。 立即下载

相关推荐

OpenTCS打造移动机器人交通管制系统(四)

先分析下OpenTCS的一些策略方面的东西,这是OpenTCS的基础。 首先需要先明确下OpenTCS内核中的三个概念: 路由(Route) : 决定了车辆通过什么样的方式和算法来获得一段路径,未来车辆将沿着此路径运行。 派遣(Dispacher): 决定了一个订单应该关联哪一辆小车,即为订单分配车辆和为车辆分配订单。 调度(schedule):狭义上的调度,交通管制的核心,决定了何时分配...

白色冰激凌的技术专栏 5272

UnicastRemoteObject.exportObject使用

  public class CalculatorServer implements Calculator { public String calculate(String expr) throws RemoteException { return expr; } public void start() throws RemoteExceptio...

hqmln的博客 1893

GEO数据挖掘实战:用R语言从GSE42872数据集中找到关键差异基因(附完整代码)

本文详细介绍了使用R语言从GSE42872数据集中挖掘关键差异基因的完整流程,包括数据下载、探针ID转换、差异表达分析和功能富集分析。通过实战代码演示,帮助生信研究者掌握GEO数据挖掘的核心技术,快速识别疾病相关基因并理解其生物学功能。

weixin_42625070的博客 365

分布式通信框架 - rmi

rmi(remote method invocation) 远程方法调用可以认为是RPC的java版本RMI使用的是JRMP(JAVA Remote Messageing Protocol),可以说JRMP是专门为java定制的通信协议,所以它是纯java的分布式解决方案。

javagty6778的博客 360

【软件系统架构】系列五:TCP/IP 协议栈

TCP/IP协议栈是现代网络通信的核心框架,采用分层架构设计,包含应用层、传输层、网络层和网络接口层四层结构。应用层提供HTTP、FTP等用户服务接口;传输层通过TCP/UDP实现端到端通信;网络层负责IP寻址和路由选择;网络接口层处理物理数据传输。数据在传输过程中经历层层封装,从应用层报文最终转换为物理层的比特流。该协议栈通过三次握手建立连接、数据传输、四次挥手断开连接的流程,确保可靠通信。作为互联网的基础,TCP/IP协议栈具有跨平台、标准化和可扩展的特点,广泛应用于各类网络设备和嵌入式系统中。

moton2017的博客 2164

面经-2023-联发科MTK-数字芯片设计

面经-2023-联发科MTK-数字芯片设计

w0shishabi的博客 2944

通过动态调试了解Java RMI底层通信

0 前言 为了明白ysoserial中提供的exploit中的JRMPClient与JRMPListener攻击原理,于是去动态调试了Java RMI来了解其底层通信原理,在此做个记录: 1 RMI服务端 首先先调试RMI服务端的代码,如下是我编写的简易RMIServer代码: public class RMIServer { public stati...

hldfight 1125

反应堆设计:基于MATLAB的反应堆仿真和分析,包括反应堆稳态分析、反应堆动态分析和反应堆安全分析 介绍

反应堆设计是利用计算机技术对核反应堆进行设计和模拟,以获得安全、高效、经济的核能发电系统。它是核能领域的重要组成部分,在电力生产、核医学、科学研究等领域有着广泛的应用。

走向CTO的路上... 1112

RMI 浅析

RMI是Remote Method Invocation的简称,即远程方法调用。通过RMI,Client可以调用Server的方法。首先,Server生成Stub和Skeleton,用于描述方法和解析方法调用。然后,Client获取Stub,即获取Server提供的方法的描述,从而知道Server提供了哪些方法及相应的参数(如图:步骤1)。接着,Client通过Stub调用Server的方法(如图:步骤2),调用信息被传递到Server(如图:步骤3),由Server的Skeleton解析。

崔显龙的博客 3722

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 699

基于卷积神经网络CNN实现电力负荷多变量时序预测(PyTorch版)

随着智能电网的发展,精准的电力负荷预测对能源调度和电网稳定具有重要意义。本文基于PyTorch框架,提出一种基于卷积神经网络(CNN)的多变量时间序列预测模型,用于电力负荷的短期预测。

时序笔记 988

rmi

       实现了Remote接口的对象为Remote对象,其可通过调用UnicastRemoteObject的exportObject将其发布到rmi server上,发布后的Remote对象可以通过其stub被客户端调用,并将执行结果返回给客户端。    可通过调用UnicastRemoteObject的unexportObject方法来结束Remote对象,在该方法被调用后,其被从rm

minfree的专栏 474

4、高光图像滤镜显著改善文本图像的光学字符识别

本文介绍了高光图像滤镜在光学字符识别(OCR)中的应用,详细探讨了其技术原理、实现步骤和在多种场景下的效果。通过增强文本图像的边缘和对比度,高光滤镜显著提升了OCR的识别率,尤其适用于扫描文档、手写笔记和低质量图像。实验结果表明,该方法在不同类型的文本图像中均表现出色,并提出了未来优化方向,如深度学习集成和多模态融合,为OCR技术的发展提供了新的可能性。

ooo22的博客 95

java rmi:远程方法调用

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。 我们知道远程过程调用(R...

bird_tp的博客 738

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RMI范型与应用

本章在介绍分布式对象范型的相关概念的基础上给出了一种典型的分布式范型----远程方法调用(RMI)的概念和原理,然后重点介绍RMI基本应用的开发方法和步骤,接着详细讨论RMI客户回调的基本原理和应用开发方法,最后详细阐述stub(桩)下载与安全管理器的基本原理和应用开发方法。 分布式对象范型 分布式对象范型的概念 消息传递范型模拟了人际间的通信模式,因此,对于分布式计算来说,是一种比较自然的模...

Fengnoi的博客 442

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

记录一下Java学习笔记:Java RMI

【定义】 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。 我们知道远程过程调用(Remote Procedure Call, RPC)可以用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了

xiaoliangtx的博客 340

java分布式之rmi实例教程_java分布式之rmi实例教程网络通信原理

java分布式之rmi实例教程网络通信原理 Java分布式之RMI实例教程 网络通信原理 前言 最近的联通项目,下一阶段可能会涉及到和各省间的 RMI 接口,所以总结一下 08 年中国 移动自动拨测系统用到的 RMI 技术,以备不时之需。同时也给广大初哥 提供一些学习资 料,哈哈。前几年,一直忙于项目,没怎么做系统总结。以后计划写一些以前项目用过的 Java 分布式技术实例教程,如:RMI、 So...

weixin_39715652的博客 206

Java中的RPC分布式范例:RMI

业务服务器接收到用户的计算请求后根据特定的算法,将计算的不同部分交由后台的不同主机处理,待结果汇总后,由业务服务器反馈给客户端。在这个过程中,开发人员最为关注的就是计算的分发调度方式,因为这涉及到对网络通讯和并发的控制。如果有一种方式能够将网络通讯和并发控制对程序开发人员透明化,那么将极度简化此类应用的开发成本,RMI就是这样一个范例。

weixin_62282158的博客 449

rmi java_分布式架构基础:Java RMI详解

RMI简介​ Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。rmi架构图rmi的实现(1) 直接使用Regis...

weixin_39811101的博客 176

Java RMI

【前面的话】 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福。 学习java RMI的原因是最近在使用dubbo框架做一个系统,所以对这java RMI进行学习,做一些笔记,基础性文章,选择性阅读。 【定义】 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调...

slw213106的博客 596

RMI基本原理

最近在研究相似图的搜索,使用的是lire一款开源的相似图软件+lucene索引框架,实现类似与:http://www.taotaosou.com/ 功能的技术,刚开始程序的时候没有考虑到框架问题,但是后来考虑到搜索的效率,研究RMI技术,使读写分离。RMI简介 RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。 RMI的基础是接口,RMI构架基于一个重要的

颢喆的专栏 1166

Java RMI技术详解与案例分析

首先,定义一个远程接口,它将被各个分行实现以提供银行服务。Remote;最后V哥要提醒一下,在实际的银行系统中,当然还需要考虑安全性、事务性、持久性以及错误处理等多方面的因素,RMI的网络通信也需要在安全的网络环境下进行,以防止数据泄露或被篡改。你在应用中是怎么使用 RMI 的,欢迎关注威哥爱编程,一起交流一下哈。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 1655

什么是RMI,为什么要使用RMI框架?

这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【什么是RMI,为什么要使用RMI框架?】 大家好,我是IT修真院深圳分院第10期的JAVA学员,一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网Java任务8,深度思考中的知识点—什么是RMI,为什么要使用RMI框架? 1.背景介绍 什么是RMI RMI是Java的一组拥护开发分布式应用程序的...

learning__java的博客 1万+
上一篇: JAVA自定义网络通信协议
下一篇: XML文档约束之DTD
心如止水dy
博客等级 码龄19年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值