RMI使用学习 小结

RMI使用学习 小结

1. RMI简介

RMI(远程方法调用)是Java编程语言中用于实现远程过程调用的应用程序编程接口。RMI使一个Java虚拟机上的对象能够调用在另一个Java虚拟机上的对象的方法。RMI实现了对象级别的远程过程调用,用户不必关心底层的网络通讯细节。

RMI使用Java远程调用(Java Remote Method Invocation)技术,Java RMI机制使两台计算机的Java虚拟机能够协同工作,其中一台Java虚拟机可以调用另一台Java虚拟机中的方法。

2. RMI使用步骤

RMI对于Java程序员来说相对比较复杂,需要考虑到的因素较多,使用步骤如下:

2.1 实现远程接口

必须有一个java接口,声明了客户端可以远程调用的方法。

public interface HelloWorld extends java.rmi.Remote {
    public String sayHello() throws java.rmi.RemoteException;
}

2.2 实现远程接口的实现类

必须有一个实现了远程接口的实现类。

public class HelloWorldImpl extends java.rmi.server.UnicastRemoteObject implements HelloWorld {
    public HelloWorldImpl() throws java.rmi.RemoteException {
        super();
    }
    public String sayHello() throws java.rmi.RemoteException {
        return "Hello World!";
    }
}

2.3 创建和安装远程对象

可以通过Java RMI提供的rmiregistry工具(位于JDK的bin文件夹下),让客户端通过远程对象来访问实现类的对象。

HelloWorld obj = new HelloWorldImpl();
try {
    // Bind the remote object's stub in the registry
    Registry registry = LocateRegistry.getRegistry();
    registry.bind("HelloWorld", obj);
    System.err.println("Server ready");
} catch (Exception e) {
    System.err.println("Server exception: " + e.toString());
    e.printStackTrace();
}

2.4 启动RMI注册表

需要在服务端启动RMI注册表,使用rmiregistry命令即可。

rmiregistry &

2.5 运行客户端

客户端必须知道实现远程接口的名称或地址。

try {
    // 指定ip和端口号,连接远程对象
    Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
    HelloWorld obj = (HelloWorld) registry.lookup("HelloWorld");// 获取远程对象调用接口方法
    String message = obj.sayHello();
    System.out.println("Message: " + message);
} catch (Exception e) {
    System.err.println("Client exception: " + e.toString());
    e.printStackTrace();
}

3. RMI使用示例

3.1 实现一个简单的计算器

远程接口

public interface Calculator extends java.rmi.Remote {
    public int add(int x, int y) throws java.rmi.RemoteException;
    public int minus(int x, int y) throws java.rmi.RemoteException;
}

远程接口实现类

public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator {
    public CalculatorImpl() throws java.rmi.RemoteException {
        super();
    }
    public int add(int x, int y) throws java.rmi.RemoteException {
        return x + y;
    }
    public int minus(int x, int y) throws java.rmi.RemoteException {
        return x - y;
    }
}

启动服务端和客户端

需要在服务端启动RMI注册表,并将远程对象绑定到注册表;客户端连接注册表,获取远程对象,并调用远程接口中定义的方法。

服务端:

Calculator obj = new CalculatorImpl();
try {
    // Bind the remote object's stub in the registry
    Registry registry = LocateRegistry.getRegistry();
    registry.bind("Calculator", obj);
    System.err.println("Server ready");
} catch (Exception e) {
    System.err.println("Server exception: " + e.toString());
    e.printStackTrace();
}

客户端:

try {
    Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
    Calculator obj = (Calculator) registry.lookup("Calculator");
    // add
    int result1 = obj.add(5, 10);
    System.out.println("5 + 10 = " + result1);
    // minus
    int result2 = obj.minus(10, 5);
    System.out.println("10 - 5 = " + result2);
} catch (Exception e) {
    System.err.println("Client exception: " + e.toString());
    e.printStackTrace();
} 

3.2 实现一个简单的通信程序

远程接口

public interface Chat extends java.rmi.Remote {
    void send(String name, String s) throws java.rmi.RemoteException;
    String get() throws java.rmi.RemoteException;
}

远程接口实现类

public class ChatImpl extends java.rmi.server.UnicastRemoteObject implements Chat {
    String message;
    public ChatImpl() throws java.rmi.RemoteException {
        super();
        message = "";
    }
    public void send(String name, String s) throws java.rmi.RemoteException {
          message = name + ": " + s;
          System.out.println(message);
    }
    public String get() throws java.rmi.RemoteException {
          return message;
    }
}

启动服务端和客户端

需要在服务端启动RMI注册表,并将远程对象绑定到注册表;客户端连接注册表,获取远程对象,并调用远程接口中定义的方法。

服务端:

Chat obj = new ChatImpl();
try {
    // Bind the remote object's stub in the registry
    Registry registry = LocateRegistry.getRegistry();
    registry.bind("Chat", obj);
    System.err.println("Server ready");
} catch (Exception e) {
    System.err.println("Server exception: " + e.toString());
    e.printStackTrace();
}

客户端:

Chat obj = (Chat) Naming.lookup("rmi://localhost/Chat");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String name;
String message;
System.out.println("Please type in your name:");
name = br.readLine();
while (true) {
    System.out.print("Message: ");
    message = br.readLine();
    obj.send(name, message);
}

4. 结论

  • RMI是JAVA中远程方法调用的重要的API和实现工具。
  • 实现RMI需要考虑到的因素较多,实现过程中需要实现远程接口和远程接口实现类,同时运行服务端和客户端。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:RMI使用学习 小结 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java数组操作经典例题大总结

    Java数组操作经典例题大总结 一、前言 数组是Java中最基础也是使用最广泛的一种数据结构。数组的使用场景很多,例如经典的冒泡排序算法、求最大值和最小值、元素去重等等。本篇文章将详细讲解Java数组操作的经典例题,并提供代码实现。 二、数组操作 1. 求最大值和最小值 求一个数组中的最大值和最小值是一个非常基础的操作。Java中提供了Arrays类,它可以…

    Java 2023年5月26日
    00
  • SpringBoot+MyBatisPlus+MySQL8实现树形结构查询

    下面我给你详细讲解“SpringBoot+MyBatisPlus+MySQL8实现树形结构查询”的完整攻略。 一、概述 在开发中,树形结构的数据查询操作是比较常见的,而使用SpringBoot+MyBatisPlus+MySQL8来实现树形结构的查询则是一种比较简单直观的方法。 二、步骤 1. 创建数据库表 首先,我们需要在MySQL8中创建一个数据表来存储…

    Java 2023年5月20日
    00
  • 浅谈java 数据处理(int[][]存储与读取)

    浅谈Java数据处理(int[][]存储与读取) 在Java中,数组是我们常用的数据结构之一。在某些场景下,我们需要处理的数据可能是一个二维数组,本篇文章将会讲解如何处理这种数据结构,包括如何存储和读取。 存储二维数组 Java中的二维数组可以使用 int[][] 来定义,其可以表示一个矩阵。我们可以通过以下代码来定义一个二维数组: int[][] matr…

    Java 2023年5月26日
    00
  • Springboot连接数据库及查询数据完整流程

    下面我将为大家详细讲解“Springboot连接数据库及查询数据完整流程”的完整攻略。 准备工作 首先,需要在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • Spring Boot中使用Spring-data-jpa的配置方法详解

    “Spring Boot中使用Spring-data-jpa的配置方法详解”的攻略如下: 1. 添加Spring Data JPA依赖 在项目的pom.xml文件中添加Spring Data JPA的依赖: <dependency> <groupId>org.springframework.boot</groupId> &…

    Java 2023年5月20日
    00
  • 详解Java中使用ImageIO类对图片进行压缩的方法

    下面我来详细讲解Java中使用ImageIO类对图片进行压缩的方法。 1. 使用ImageIO类加载图片 在Java中使用ImageIO类来加载图片,可以使用以下代码: BufferedImage image = ImageIO.read(new File("image.jpg")); 上述代码中的image.jpg是需要压缩的图片的文件…

    Java 2023年5月26日
    00
  • Java Listener监听器使用规范详细介绍

    下面就是「Java Listener监听器使用规范详细介绍」的攻略: 什么是 Java Listener 监听器? Java Listener 监听器是一种设计模式,主要用于处理事件。事件可以是用户在程序中的交互(例如,单击按钮、选择菜单项等),也可以是由程序本身触发的事件(例如,资源加载完成、对象/文件/网络IO操作完成等)。 Java Listener …

    Java 2023年6月15日
    00
  • 浅谈jsp EL表达式取值过程、page和pagecontext的区别

    下面我将详细讲解“浅谈jsp EL表达式取值过程、page和pagecontext的区别”的完整攻略,希望能对你有所帮助。 什么是EL表达式 EL表达式(Expression Language)是一个用于在JSP中获取数据的表达式语言,主要用于在JSP页面中引用和显示Java Bean中的属性值、参数、方法调用等。它的语法类似于JavaScript和PHP等…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部