深入理解RMI原理


深入理解RMI原理

定义:

RMI(Remote Method Invoke远程方法调用),为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

Java RMI:(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口,它使客户机上运行的程序可以调用远程服务器上的对象,使Java编程人员能够在网络环境中分布操作。只要一个类继承了java.rmi.Remote接口,就可以成为存在于服务器端的远程对象,给客户端提供服务。其中,Remote接口用于标识其方法可以从非本地虚拟机上调用,任何远程对象都必须间接或直接实现该接口。

RMI原理的几个问题:

1、是谁创建了s tubs对象,服务器?客户端?还是注册中心?

2、怎么知道服务器监听的端口是哪一个?

3、注册中心对RMI系统来说是必须的吗?

4、如果没有注册中心,RMi可以运行吗?

请忘记注册中心

大概的场景应该是这样的:我们有一个server和一个client,server继承了java.rmi.server.UnicastRemoteObject

client和server运行在不同的机器上面。

现在我们的需求是这样的:client想执行一个在远程机器上的server的一个方法

我们如果做到这一点?java rmi 会处理这些问题,解决方案肯定会涉及到socket网络编程,因为server运行在远程机器上,解决这个问题的关键点在于

1、客户端如何从处理网络链接中解耦开来

2、客户端如何能就像调用本地方法一样来调用远程机器上的方法 ,因此rmi的开发人员就引入了stub和skeleton模型

用一个例子来说明整个过程

package com.free04k;

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

public interface IHello  extends Remote {
    //简单返回"Hello World"
    public  String helloWord() throws RemoteException;

    //一个简单的业务方法,根据传入的人名返回相对应的问候语
    public  String Hellotomso (String someBodyName) throws  RemoteException;
}
package com.free04k;

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

public class HelloImpl extends UnicastRemoteObject  implements  IHello{
    private static final long serialVersionUID = -5638936712154214504L;

    public  HelloImpl() throws RemoteException{

    }

    @Override
    public String helloWord() throws RemoteException {
        return "hello World";
    }

    @Override
    public String Hellotomso(String someBodyName) throws RemoteException {
        return "你好" + someBodyName + "!";
    }
}

server服务器的实现:

package com.free04k;

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

public class HelloImpl extends UnicastRemoteObject  implements  IHello{
    private static final long serialVersionUID = -5638936712154214504L;

    public  HelloImpl() throws RemoteException{

    }

    @Override
    public String helloWord() throws RemoteException {
        return "hello World";
    }

    @Override
    public String Hellotomso(String someBodyName) throws RemoteException {
        return "你好" + someBodyName + "!";
    }

Server发布服务

1、创建一个远程服务对象,已及实现

2、在指定的端口上发布RMIRegistry服务,用户客户端链接

3、在注册中心发布服务

ackage com.free04k;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class Imserver {
    public static void main(String[] args) {
        try {
            //创建一个远程对象
            IHello rhello = new HelloImpl();

            //本地主机上的远程对象注册表Registry实例,并指定客户端为7777这一步必不可少
            LocateRegistry.createRegistry(7777);
            Naming.bind("//127.0.0.1:7777/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();
        }
    }
}

上述为服务端Server发布服务的整个过程

image-20200622103559149

Author: Free04kSec
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Free04kSec !
 Previous
Opencanary开源蜜罐 Opencanary开源蜜罐
Opencanary开源蜜罐介绍:opencanary_web是一个Linux web蜜罐管理系统,基于Tornado+Vue+Mysql+APScheduler+Nginx+Supervisor。可收集相对全面的攻击信息,还具有很多管理功
2020-07-06 Free04kSec
Next 
Cobalt Strike基础设施 Cobalt Strike基础设施
Cobalt Strike基础设施在基础设施方面,我们希望设置这样一个可重用且高度灵活的环境。Cobalt Strike 支持重定向,当你的 Cobalt Strike 使用的 C2 域名被销毁了,你不需要创建并启用一个新的环境,只需要替换
2020-06-20 Free04kSec
  TOC