• 使用RMI实现RPC


    1 RMI简介

    RMI(Remote Method Invocation) 远程方法调用。

    RMI是从JDK1.2推出的功能,它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用(JVM)中的内容。

    RMI 是Java语言的远程调用,无法实现跨语言。

    2 执行流程

     

    Registry(注册表)是放置所有服务器对象的命名空间。 每次服务端创建一个对象时,它都会使用bind()或rebind()方法注册该对象。 这些是使用称为绑定名称的唯一名称注册的。

    要调用远程对象,客户端需要该对象的引用。即通过服务端绑定的名称从注册表中获取对象(lookup()方法)。

    3 API介绍

    3.1 Remote

    java.rmi.Remote 定义了此接口为远程调用接口。如果接口被外部调用,需要继承此接口。

    public interface Remote{}

    3.2 RemoteException

    java.rmi.RemoteException

    继承了Remote接口的接口中,如果方法是允许被远程调用的,需要抛出此异常。

    3.3 UnicastRemoteObject

    java.rmi.server.UnicastRemoteObject

    此类实现了Remote接口和Serializable接口。

    自定义接口实现类除了实现自定义接口还需要继承此类。

    3.4 LocateRegistry

    java.rmi.registry.LocateRegistry

    可以通过LocateRegistry在本机上创建Registry,通过特定的端口就可以访问这个Registry。

    3.5 Naming

    java.rmi.Naming

    Naming定义了发布内容可访问RMI名称。也是通过Naming获取到指定的远程方法。

    4 代码实现

    4.1 服务端创建

    创建RmiServer项目

    4.1.1 编写接口

    com.msb.service.DemoService 编写

    1. public interface DemoService extends Remote {
    2.   String demo(String demo) throws RemoteException;
    3. }

    4.1.2 编写实现类

    com.msb.service.impl.DemoServiceImpl 编写。

    注意:构造方法是public的。默认生成protected

    1. public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {
    2.   public DemoServiceImpl() throws RemoteException {
    3.   }
    4.   @Override
    5.   public String demo(String demo) throws RemoteException {
    6.       return demo+"123";
    7.   }
    8. }

    4.1.3 编写主方法

    编写com.msb.DemoServer类,生成主方法

    1. public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {
    2.   public DemoServiceImpl() throws RemoteException {
    3.   }
    4.   @Override
    5.   public String demo(String demo) throws RemoteException {
    6.       return demo+"123";
    7.   }
    8. }

    4.1.4 运行项目

    运行后项目,项目一直处于启动状态,表示可以远程访问此项目中的远程方法。

    4.2 创建客户端代码

    创建项目RmiClient

    4.2.1 复制服务端接口

    把服务端com.msb.service.DemoService粘贴到项目中

    4.2.2 创建主方法类

    新建com.msb.DemoClient

    1. public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {
    2.   public DemoServiceImpl() throws RemoteException {
    3.   }
    4.   @Override
    5.   public String demo(String demo) throws RemoteException {
    6.       return demo+"123";
    7.   }
    8. }

  • 相关阅读:
    基于Python的购物网站分析系统
    2022/11/7(cf·div2·CTR3)https://codeforces.com/contest/1750
    STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)
    8.2 矢量图层点要素单一符号使用一
    学C语言的第一节课
    免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
    SpringBoot整合Redis - @Cacheable 和 RedisTemplate
    老卫带你学---leetcode刷题(406. 根据身高重建队列)
    震惊!我竟然在1080Ti上加载了一个35亿参数的模型(ZeRO, Zero Redundancy Optimizer)
    具有自适应搜索策略的灰狼优化算法-附代码
  • 原文地址:https://blog.csdn.net/listeningdu/article/details/128198495