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 中使用 AWT 和 Swing 可以轻松创建窗口和画布。具体实现可以按照以下步骤: 新建 Canvas 类,扩展 javax.swing.JPanel 类。 重写 JPanel 的 paintComponent 方法,在方法中实现画布的…

    Java 2023年5月19日
    00
  • 使用Java7的Files工具类和Path接口来访问文件的方法

    使用Java7的Files工具类和Path接口可以方便快捷地读写文件和目录等操作。下面将介绍使用Java7的Files工具类和Path接口来访问文件的方法。 创建Path对象 在使用Files工具类和Path接口访问文件之前,需要先创建Path对象。创建Path对象有三种方法: 通过Paths.get()方法 java Path path = Paths.g…

    Java 2023年5月20日
    00
  • Java8中方法引用的使用详解

    Java8中方法引用的使用详解 什么是方法引用? Java8中的方法引用是一种新特性,使用方法引用可以更加简洁的定义Lambda表达式。方法引用是指引用已经存在的方法而不是声明一个Lambda表达式来调用该方法。 方法引用的语法 方法引用的语法在箭头函数的基础上添加一个双冒号“::”,语法格式如下: object::instanceMethod ClassN…

    Java 2023年5月26日
    00
  • 微信小程序录音文件格式silk遇到的问题及解决方法

    微信小程序录音文件格式silk遇到的问题及解决方法 问题描述 最近在开发微信小程序录音功能时,遇到了一个问题,就是录音文件格式为silk格式,但无法在浏览器中直接播放,也无法在后端进行处理。这使得我们无法进行后续的处理工作。因此,我们需要找到一种解决方法。 问题分析 经过查阅资料,我们发现silk格式是由语音编解码器发明的,通常用在VoIP(网络电话)通信中…

    Java 2023年5月23日
    00
  • Java Mybatis框架由浅入深全解析下篇

    Java Mybatis框架由浅入深全解析下篇 本文将由浅入深地解析Java Mybatis框架,讲解Mybatis框架的基本原理、应用场景、核心组件以及使用技巧等内容。 Mybatis框架基本原理 Mybatis框架是一个轻量级的ORM框架,它将Java对象和SQL语句映射成为数据库操作语句。Mybatis框架通过映射文件将Java类和SQL语句进行映射,…

    Java 2023年6月2日
    00
  • jsp Request获取url信息的各种方法对比

    JSP Request获取URL信息的各种方法对比 当我们在JSP文件中需要获取URL信息时,可以使用多种方式,本文将对比一下常用的几种方法。 request.getRequestURL() request.getRequestURL() 方法可以获取当前请求的URL。 示例: <% String url = request.getRequestURL…

    Java 2023年6月15日
    00
  • Java中的字符编码问题处理心得总结

    Java中的字符编码问题处理心得总结 在Java编程中,字符编码问题是一个常见的挑战。如果没有正确地处理字符编码,会出现许多问题,例如乱码、字符截断、字符丢失等。为了避免这些问题,我们需要按照以下步骤进行处理。 第一步:了解字符编码和字符集 在处理字符编码问题之前,我们需要了解字符编码和字符集的概念。 字符编码是指将字符转换为二进制形式的过程。在计算机机内部…

    Java 2023年5月31日
    00
  • 说说Java异步调用的几种方式

    下面我将详细讲解Java异步调用的几种方式及其示例: 什么是异步调用 异步调用是指在调用函数时,不会等待函数执行完成才返回结果,而是在函数执行的同时继续执行其他的代码,当函数执行完成后再回过头来处理执行结果。通常用于需要耗时的操作,如网络请求、数据库查询等,可以避免阻塞主线程而影响用户体验。 Java异步调用的几种方式 1. 回调函数 回调函数是指在调用函数…

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