Java RMI 远程方法调用

Java RMI

介绍

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

允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。通俗来说就是 A 机器上的 class 可以调用 B 机器上的 class 中的方法。

作用

为分布式 Java 应用程序之间的远程通信提供服务

例子

首先我这里新建了两个 project,一个是服务端,一个是客户端。服务端提供远程服务供客户端调用。话不多说,直接上代码!

服务端:

  • 定义一个 Hello 接口实现 Remote 接口
package com.carl.hello;

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

public interface Hello extends Remote {
	// 远程接口中方法声明时必须抛出 RemoteException 或它的超类
    String sayHello() throws RemoteException;
}
  • 定义实现类实现 Hello 接口
package com.carl.hello;

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

public class HelloImpl extends UnicastRemoteObject implements Hello {

    private String message;
	
	// 必须写出构造方法并抛出 RemoteException,无参构造也必须声明出来且抛出异常
    public HelloImpl(String message) throws RemoteException {
        this.message = message;
    }

    @Override
    public String sayHello() {
        System.out.println("================> SayHello is Called");
        return message;
    }
}
  • 最后写一个类将接口注册到注册表中
package com.carl;

import com.carl.hello.Hello;
import com.carl.hello.HelloImpl;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class HelloServer {
    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.createRegistry(8080);
            Hello hello = new HelloImpl("hello world !");
            registry.bind("hello", hello);
            System.out.println("Registry success...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到这里服务端就写完了…

客户端:

  • 定义客户端接口
package com.carl.hello;
// 包名必须和服务端一样,否则报错
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    String sayHello() throws RemoteException;
}
  • 定义一个类获取远程服务接口
import com.carl.hello.Hello;

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class HelloClient {
    public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
        Registry registry = LocateRegistry.getRegistry("localhost", 8080);
        Hello hello = (Hello) registry.lookup("hello");
        System.out.println(hello.sayHello());
    }
}

到这里所有代码就写完啦~

先运行服务端,再运行客户端

输出结果:
在这里插入图片描述

局限

RMI 使用的是 Java 远程消息交换协议 JRMP(Java Remote Messaging Protocol)进行通信,这是专门为 Java 远程对象调用制定的协议,不适合非 Java 语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值