首页 > 编程语言 >Java的Rmi

Java的Rmi

时间:2024-08-17 18:06:39浏览次数:12  
标签:Rmi java String import Java RemoteException rmi public

什么是Rmi

RMI(Remote Method Invocation)的全称为远程方法调用。远程方法调用是分布式编程中的一个基本思想。实现远程方法调用的技术有很多,比如:CORBA、WebService,这两种都是独立于编程语言的。而Java RMI(Java Remote Method Invocation)是专为Java环境设计的远程方法调用机制,能够让一台Java虚拟机上的对象调用运行在另一台Java虚拟机上的对象的方法。它使客户机上运行的程序可以调用远程服务器上的对象。

具体的通信流程如下

  • Server监听一个端口,这个端口是JVM随机选择的
  • Client并不知道Server远程对象的通信地址和端口,但是位于Client的Stub中包含了这些信息,并封装了底层网络操作。Client可以调用Stub上的方法,并且也可以向Stub发送方法参数。
  • Stub连接到Server监听的通信端口并提交参数
  • Server执行具体的方法,并将结果返回给Stub
  • Stub返回执行结果给Client。因此在Clinet看来,就好像是Stub在本地执行了这个方法。

基本使用

远程对象

任何可以被远程调用方法的对象必须继承java.rmi.Remote接口,远程对象的实现类必须继承UnicastRemoteObject类。如果不继承UnicastRemoteObject类,则需要手工初始化远程对象,在远程对象的构造方法的调用UnicastRemoteObject.exportObject()静态方法。

package learn.rmi;
 
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface IHello extends Remote {
    public String sayHello(String name) throws RemoteException;
}

实现类

package learn.rmi;
 
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
 
public class RMIServer {
 
    public class RMIHello extends UnicastRemoteObject implements IHello{
        protected RMIHello() throws RemoteException{
            super();
        }
 
//      在没有继承UnicastRemoteObject的时候构造函数也可以写成如下形式
//      protected RMIHello() throws RemoteException{
//          UnicastRemoteObject.exportObject(this,0);
//      }
 
 
        @Override
        public String sayHello(String name) throws RemoteException {
            System.out.println("Hello World!");
            return "Feng";
        }
    }
 
}

服务器端

package learn.rmi;
 
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface IHello extends Remote {
    public String sayHello(String name) throws RemoteException;
}

实现类

package learn.rmi;
 
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
 
public class RMIServer {
 
    public class RMIHello extends UnicastRemoteObject implements IHello {
        protected RMIHello() throws RemoteException{
            super();
        }
 
        @Override
        public String sayHello(String name) throws RemoteException {
            System.out.println("Hello World!");
            return name;
        }
    }
 
    private void register() throws Exception{
        RMIHello rmiHello=new RMIHello();
        LocateRegistry.createRegistry(1099);
        Naming.bind("rmi://0.0.0.0:1099/hello",rmiHello);
        System.out.println("Registry运行中......");
    }
 
    public static void main(String[] args) throws Exception {
        new RMIServer().register();
    }
}

这里的

private void register() throws Exception{
        RMIHello rmiHello=new RMIHello();
        LocateRegistry.createRegistry(1099);
        Naming.bind("rmi://0.0.0.0:1099/hello",rmiHello);
        System.out.println("Registry运行中......");
    }

就是实现我们上文中说的Stub的传递功能即RMI Registry的注册。即让RMI Registry中保存了rmiHello远程对象的端口信息。

客户端

package learn.rmi;
 
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface IHello extends Remote {
    public String sayHello(String name) throws RemoteException;
}
package learn.rmi;
 
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
 
public class RMIClient {
    public static void main(String[] args) throws Exception{
        Registry registry= LocateRegistry.getRegistry("127.0.0.1",1099);
        IHello iHello=(IHello) registry.lookup("hello");
        System.out.println(iHello.sayHello("Feng"));
    }
}

客户端先向RMI注册表查询某个远程对象名称,来获取该远程对象的Stub。然后获取到对应的接口信息后,才会真正去获取对应的远程对象信息。

参考文章

https://goodapple.top/archives/321

标签:Rmi,java,String,import,Java,RemoteException,rmi,public
From: https://www.cnblogs.com/Ho1dF0rward/p/18364750

相关文章

  • Java的Io
    JavaIO基础IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。Java中是通过流处理IO的,那么什么是流?流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。当程序需要读取数据的时......
  • Java的动态代理
    代理模式代理模式给某一个(目标)对象提供一个代理对象,并由代理对象持有目标对象的引用。所谓代理,就是一个对象代表另一个对象执行相应的动作程序。而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式在实际的生活中场景很多,例如中介、律师、代购等行业,都是简单的代......
  • java+vue计算机毕设基于Web的在线考试管理信息系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和教育改革的不断深入,传统考试模式已难以满足现代教育的需求。在线考试作为一种新兴的教育评估方式,凭借其便捷性、高效性和灵......
  • 基于ssm的新生报到系统(有报告)。Javaee项目,ssm项目。
    演示视频:基于ssm的新生报到系统(有报告)。Javaee项目,ssm项目。资源下载:基于ssm的新生报到系统(有报告)。Javaee项目,ssm项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Maven来实现。MySQL数据库作为系统数据储存......
  • 基于ssm的在线医疗服务系统(有报告)。Javaee项目,ssm项目。
    演示视频:基于ssm的在线医疗服务系统(有报告)。Javaee项目,ssm项目。资源下载:基于ssm的在线医疗服务系统(有报告)。Javaee项目,ssm项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Maven来实现。MySQL数据库作为系统......
  • 【Java毕设选题推荐】基于SpringBoot的springboot基于Android的房屋租赁App
    前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务......
  • Java数据库框架设计
    什么是ORM?ORM(Object-RelationalMapping)表示对象关系映射。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作数据库数据,就可以说这套程序实现了ORM对象关系映射简单的说:ORM就是建立实体......
  • Java的Spi
    什么是SPI?SPI全称:ServiceProviderInterface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需......
  • JAVA数据库
    基础概念ORM框架ORM框架是一种技术,用于在面向对象的编程语言(如Java)和关系型数据库之间建立映射关系。ORM框架允许开发者使用面向对象的方式操作数据库,而不需要直接编写SQL语句。JPAJPA是一种Java持久化API规范,定义了一套标准的Java持久化API。JPA规......
  • 【免费】ssm驾校预约管理系统jsp|毕业设计|Javaweb项目
    收藏点赞不迷路 关注作者有好处编号:ssm560ssm驾校预约管理系统jsp开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven1.系统展示2.万字文档展示第5章系统详细设计系统实现这个章节的内容主要还是展示系统的功能界面设计......