首页 > 编程语言 >Java RMI实现RPC(远程过程调用)

Java RMI实现RPC(远程过程调用)

时间:2023-08-26 15:11:49浏览次数:34  
标签:RMI java server RPC import Java RemoteException rmi public

RMI(Remote Method Invocation,远程方法调用)是一个Java RPC的API,用于一台主机传递参数并远程调用另一台主机上的方法,下面给出一个简单实例。

环境:win10宿主机作为rmi client,ubuntu虚拟机(IP为192.168.129.49)作为rmi server。现在client希望向server传递参数,调用server端的服务并获取返回值

  • 在server上均创建HelloService.java(远程服务接口), HelloServiceImpl.java(远程服务接口的具体实现), RMIServer.java(服务端代码)
  • 在client上只需创建HelloService.java(远程服务接口), RMIClient.java(客户端代码)
  • 注意:服务端和客户端的package(我这里是com.ydj.rmi)必须相同,否则报错!

HelloService.java定义了一个远程服务HelloService,包含一个接口welcome()

package com.ydj.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloService extends Remote {
    public String welcome(String name) throws RemoteException;
}

HelloServiceImpl.java具体实现了welcome(),输出Hello+传来的字符串参数

package com.ydj.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
    @Override
    public String welcome(String name) throws RemoteException {
        return "Hello " + name;
    }
    public HelloServiceImpl() throws RemoteException{
    }
}

server端代码:在本地URL 192.168.129.49:1099/Hello 上启动服务。

package com.ydj.rmi;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIServer {
    public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
        HelloService helloService = new HelloServiceImpl();
        LocateRegistry.createRegistry(1099);
        Naming.bind("rmi://192.168.129.49:1099/Hello",helloService);
        System.out.println("service start");
    }
}

client端代码:请求虚拟机上的服务,并传参字符串mika。如果需要传递一个对象,则需要序列化

package com.ydj.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class RMIClient {
    public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
        HelloService helloService = (HelloService) Naming.lookup("rmi://192.168.129.49:1099/Hello");
        System.out.println(helloService.welcome("mika"));
    }
}

先启动server,然后运行client,client调用了server的welcome()成功输出:

Hello mika

注意:如果报错java.rmi.ConnectException: Connection refused to host: 127.0.1.1,表明server端的/etc/hosts文件需要修改,将原来的127.0.1.1 主机名改为192.168.129.49 主机名即可。

标签:RMI,java,server,RPC,import,Java,RemoteException,rmi,public
From: https://www.cnblogs.com/nemuzuki/p/17658815.html

相关文章

  • LeetCode-26. 删除有序数组中的重复项(Java)
    这是我在51CTO博客开启的写作之路,第一次正式写博客记录我在LeetCode的刷题日,希望能帮助更多的小伙伴攻面自己心仪的公司offer。如下对于 LeetCode-26. 删除有序数组中的重复项,进行全面解析并小结解题思路,同学们请参考:1.题目描述给你一个 升序排列 的数组 nums ,请你 原地 删......
  • java最容易犯错的8道面试题
    1.static和final的用法static的作用从三个方面来谈,分别是静态变量、静态方法、静态类。静态变量:声明为static的静态变量实质上就是全局变量,当声明一个对象时,并不产生static变量的拷贝,而是该类所有实例变量共用同一个static变量。也就是说这个静态变量只加载一次,只分配一......
  • java最容易犯错的8道面试题
    1.static和final的用法static的作用从三个方面来谈,分别是静态变量、静态方法、静态类。静态变量:声明为static的静态变量实质上就是全局变量,当声明一个对象时,并不产生static变量的拷贝,而是该类所有实例变量共用同一个static变量。也就是说这个静态变量只加载一次,只分配......
  • java高频面试题(反射、对象拷贝)
    java高频面试题(反射、对象拷贝)什么是反射?反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力Java反射:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法Java反射机制主要提供了以下功能:在运行时判断任意一个......
  • java-文件复制练习
    packagecom.example.ss_0203_array.test.test_0826;importjava.io.*;publicclasstest2{publicstaticvoidmain(String[]args)throwsIOException{Filesrc=newFile("F:\\阿里云盘下载\\B站黑马java基础\\day10_字符串\\代码\\mystring");......
  • Java中static关键字
    叙述:static关键字是很多朋友在编写和阅读代码时比较难理解的一个关键字,但也是面试尤其笔试的考点。下面就从static关键字的用途常见面试题两个方面来描述以下我对static关键字的理解原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html一.static关键字用途在《......
  • 面试类-Java编程(二)
    18.说一下你对Java内存模型(JMM)的理解?Java内存模型(JavaMemoryModel,JMM),是一种抽象的模型,被定义出来屏蔽各种硬件和操作系统的内存访问差异。JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存(LocalMemory),本地内......
  • Java智慧工地APP监管平台源码带AI识别功能
    智慧工地为建筑全生命周期赋能,用创新的可视化与智能化方法,降低成本,创造价值。一、智慧工地APP概述智慧工地”立足于互联网+,采用云计算,大数据和物联网等技术手段,针对当前建筑行业的特点,结合建筑企业信息化工作的需求,以建设工程为核心,以建筑行业企业、人员,项目信息库为基础,搭建智......
  • java数组、面向对象的引入
    packagecom.momo.demo;publicclassMain{publicstaticvoidmain(String[]args){int[]arr=newint[3];System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);arr[0]=55;arr[2]=66;System.o......
  • Java猜拳小游戏
    以下代码是一个猜拳小游戏的实现,其中包含了用户输入、随机数生成、逻辑判断和输出结果等功能。首先让用户输入名字,然后每轮循环中用户输入出拳手势,根据输入的数字1、2、3分别代表石头、剪刀、布;同时,系统也会产生一个随机数表示电脑出拳手势。判断用户和电脑的胜负关系,并输出结果。......