返回顶部
首页 > 资讯 > 精选 >Java中RMI的使用案例
  • 541
分享到

Java中RMI的使用案例

2023-06-15 01:06:12 541人浏览 独家记忆
摘要

这篇文章主要介绍了Java中RMI的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数

这篇文章主要介绍了Java中RMI的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

java基本数据类型有哪些

Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。

RMI 介绍

RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果。这里的另一个 JVM 可以在同一台计算机也可以是远程计算机。因此,RMI 意味着需要一个 Server 端和一个 Client 端。

Server 端通常会创建一个对象,并使之可以被远程访问。

这个对象被称为远程对象。Server 端需要注册这个对象可以被 Client 远程访问。

Client 端调用可以被远程访问的对象上的方法,Client 端就可以和 Server 端进行通信并相互传递信息。

说到这里,是不是发现使用 RMI 在构建一个分布式应用时十分方便,它和 rpc 一样可以实现分布式应用之间的互相通信,甚至和现在的微服务思想都十分类似。

RMI 工作原理

正所谓 “知其然知其所以然”,在开始编写 RMI 代码之前,有必要了解一下 RMI 的工作原理,RMI 中 Client 端是和 Server 端是如何通信的呢?

下图的可以帮助我们理解RMI 的工作流程。

Java中RMI的使用案例

从图中可以看到,Client 端有一个被称 Stub 的东西,有时也会被成为存根,它是 RMI Client 的代理对象,Stub 的主要功能是请求远程方法时构造一个信息块,RMI 协议会把这个信息块发送给 Server 端。

这个信息块由几个部分组成:

  • 远程对象标识符。

  • 调用的方法描述。

  • 编组后的参数值(RMI协议中使用的是对象序列化)。

既然 Client 端有一个 Stub 可以构造信息块发送给 Server 端,那么 Server 端必定会有一个接收这个信息快的对象,称为 Skeleton 。

它主要的工作是:

  • 解析信息快中的调用对象标识符和方法描述,在 Server 端调用具体的对象方法。

  • 取得调用的返回值或者异常值。

  • 把返回值进行编组,返回给客户端 Stub.

到这里,一次从 Client 端对 Server 端的调用结果就可以获取到了。

RMI 开发

通过上面的介绍,知道了 RMI 的概念以及 RMI 的工作原理,下面介绍 RMI 的开发流程。

这里会通过一个场景进行演示,假设 Client 端需要查询用户信息,而用户信息存在于 Server 端,所以在 Server 端开放了 RMI 协议接口供客户端调用查询。

RMI Server

Server 端主要是构建一个可以被传输的类 User,一个可以被远程访问的类 UserService,同时这个对象要注册到 RMI 开放给客户端使用。

定义服务器接口(需要继承 Remote 类,方法需要抛出 RemoteException)。

package com.wdbyte.rmi.server;import java.rmi.Remote;import java.rmi.RemoteException;public interface UserService extends Remote {        User findUser(String userId) throws RemoteException;}

User 对象在步骤 3 中定义。

实现服务器接口(需要继承 UnicastRemoteObject 类,实现定义的接口)。

package com.wdbyte.rmi.server;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class UserServiceImpl extends UnicastRemoteObject implements UserService {    protected UserServiceImpl() throws RemoteException {    }    @Override    public User findUser(String userId) throws RemoteException {        // 加载在查询         if ("00001".equals(userId)) {            User user = new User();            user.setName("金庸");            user.setAge(100);            user.setSkill("写作");            return user;        }        throw new RemoteException("查无此人");    }}

定义传输的对象,传输的对象需要实现序列化(Serializable)接口。

需要传输的类一定要实现序列化接口,不然传输时会报错。idea 中如何生成 serialVersionUID,在文章末尾也附上了简单教程

package com.wdbyte.rmi.server;import java.io.Serializable;public class User implements Serializable {    private static final long serialVersionUID = 6490921832856589236L;    private String name;    private Integer age;    private String skill;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public String getSkill() {        return skill;    }    public void setSkill(String skill) {        this.skill = skill;    }        @Override    public String toString() {        return "User{" +            "name='" + name + '\'' +            ", age=" + age +            ", skill='" + skill + '\'' +            '}';    }}

注册( rmireGIStry)远程对象,并启动服务端程序。

服务端绑定了 UserService 对象作为远程访问的对象,启动时端口设置为 1900。

package com.wdbyte.rmi.server;import java.rmi.Naming;import java.rmi.registry.LocateRegistry;public class RmiServer {    public static void main(String[] args) {        try {            UserService userService = new UserServiceImpl();            LocateRegistry.createRegistry(1900);            Naming.rebind("rmi://localhost:1900/user", userService);            System.out.println("start server,port is 1900");        } catch (Exception e) {            e.printStackTrace();        }    }}

RMI Client

相比 Server 端,Client 端就简单的多。直接引入可远程访问和需要传输的类,通过端口和 Server 端绑定的地址,就可以发起一次调用。

package com.wdbyte.rmi.client;import java.rmi.Naming;import com.wdbyte.rmi.server.User;import com.wdbyte.rmi.server.UserService;public class RmiClient {    public static void main(String args[]) {        User answer;        String userId = "00001";        try {            // lookup method to find reference of remote object            UserService access = (UserService)Naming.lookup("rmi://localhost:1900/user");            answer = access.findUser(userId);            System.out.println("query:" + userId);            System.out.println("result:" + answer);        } catch (Exception ae) {            System.out.println(ae);        }    }}

RMI 测试

启动 Server 端。

start server,port is 1900

启动 Client 端。

query:00001result:User{name='金庸', age=100, skill='写作'}

如果 Client 端传入不存在的 userId。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.RemoteException: 查无此人

serialVersionUID 的生成

IDEA 中生成 serialVersionUID,打开设置,如下图所示勾选。

Java中RMI的使用案例

选中要生成 serialVersionUID 的类,按智能提示快捷键。

Java中RMI的使用案例

感谢你能够认真阅读完这篇文章,希望小编分享的“Java中RMI的使用案例”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java中RMI的使用案例

本文链接: https://lsjlt.com/news/276261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中RMI的使用案例
    这篇文章主要介绍了Java中RMI的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数...
    99+
    2023-06-15
  • 详解Java 中 RMI 的使用
    目录RMI 介绍RMI 工作原理RMI 开发RMI ServerRMI ClientRMI 测试serialVersionUID 的生成 RMI 介绍 RMI (Remote Met...
    99+
    2024-04-02
  • java中RMI指的是什么
    这篇文章将为大家详细讲解有关java中RMI指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 R...
    99+
    2023-06-15
  • java中RMI的工作过程
    小编给大家分享一下java中RMI的工作过程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、工作流程Client方面有被称为Stub的东西,有时也会成为存根,是...
    99+
    2023-06-15
  • java中RMI的原理是什么
    这篇文章主要介绍了java中RMI的原理是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明Client 端有一个被称 Stub 的东西,有时也会被成为存根,它是 R...
    99+
    2023-06-15
  • 如何理解Java 中的RMI-IIOP
    本篇文章为大家展示了如何理解Java 中的RMI-IIOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。环境说明文中的测试代码放到了github上测试代码的JDK版本在文中会具体说明,有的代码会被重...
    99+
    2023-06-05
  • java中构造方法的使用案例
    这篇文章主要介绍了java中构造方法的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序...
    99+
    2023-06-15
  • Java中DateTimeFormatter的使用方法和案例
    🔔简介 在Java中,DateTimeFormatter类用于格式化和解析日期时间对象。它是日期时间格式化的强大而灵活的工具。 🔔作用 🌵1.本地化时间...
    99+
    2023-10-02
    java 开发语言
  • Java Date类的使用案例详解
    Date类表示特定的瞬间,精确到毫秒。 有2种方法可以创建Date对象(这里不考虑已过时的构造函数) 1、public Date()——分配 Date 对象并初始化此对象,以表示分配...
    99+
    2024-04-02
  • Java之Jackson使用案例详解
    序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取...
    99+
    2024-04-02
  • Java Springboot websocket使用案例详解
    什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 … 为什么要实现握手监控管理 如果说,连接随意创建,不管的话,会存在错误,broken pi...
    99+
    2024-04-02
  • Java Calendar类使用案例详解
      在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用户登陆的时间,比如银行的一些网站,对于...
    99+
    2024-04-02
  • MySQL中注释的使用案例
    这篇文章主要介绍MySQL中注释的使用案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!每一种语言都有自己的注释方式,代码量越多,代码注释的重要性也就越明显。一般情况下,注释可以出现...
    99+
    2024-04-02
  • 使用PHP中PDO::beginTransaction的案例
    小编给大家分享一下使用PHP中PDO::beginTransaction的案例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框...
    99+
    2023-06-14
  • Java中stream处理中map与flatMap的比较和使用案例
    前言 使用Java8的新特性Stream流式处理,可以提高对于集合的一些操作效率,再配合lambda表达式,可以极致的简化代码,尤其还有并行流这个东东,可以去 了解一下,在一些场合...
    99+
    2024-04-02
  • Java之Jackson的基本使用案例讲解
    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看...
    99+
    2024-04-02
  • 使用java实现2048小游戏的案例
    这篇文章将为大家详细讲解有关使用java实现2048小游戏的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下实现文件APP.javaimport javax.swing.*;pub...
    99+
    2023-06-14
  • Java this关键字的使用案例详解
    目录Boy类Girl类BoyGirlTest类总结通过一个小案例来学习、理解一下this关键字的使用~~~ Boy类 package myjava1; public class B...
    99+
    2024-04-02
  • CSS的使用案例
    小编给大家分享一下CSS的使用案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 内联方式:样式定义在单个的HTML元素中 ...
    99+
    2024-04-02
  • Java使用elasticsearch基础API使用案例讲解
    1.依赖 我用的是 springboot 2.2.5.RELEASE 版本,这里只贴出主要依赖: <dependency> <groupId>o...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作