RMI

发布时间 2024-01-01 18:49:18作者: qingshanboy

Java-RMI

RMI允许远程调用对象。RMI机制有一个服务端一个客户端,服务端创建注册中心,并绑定相应的对象,并给对象起一个名字,方便获取。客户端获取注册中心,通过注册中心使用给对象起的名字,可以定位到对象并调用。

注册中心有一个固定的端口

一个继承了Remote的接口IRemoteObj:

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

public interface IRemoteObj extends Remote {
    public String sale(String s) throws RemoteException;
}

IRemoteObj接口的实现类IRemoteObjIml:

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

public class IRemoteObjIml extends UnicastRemoteObject implements IRemoteObj{//该接口实现类继承UnicastRemoteObject
    protected IRemoteObjIml() throws RemoteException {
        super();
    }

    @Override
    public String sale(String s) throws RemoteException{
        System.out.println(s);
        return s;
    }
}

服务端:

实例化一个接口实现类IRemoteObjIml的对象用于绑定到注册中心

实例化一个注册中心

把IRemoteObjIml的对象绑定到注册中心,并起一个名字


import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;



public class rmiserver1 {
    public static void main(String[] args) throws Exception{
        IRemoteObj obj = new IRemoteObjIml();
        Registry registry = LocateRegistry.createRegistry(12346);
        registry.bind("test",obj);//客户端远程调用可以通过test找到该对象
    }

}

客户端:

通过ip和port得到注册中心,然后使用lookup找到要调用的对象


import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class clientrmi1 {
    public static void main(String[] args) throws Exception{
        Registry registry = LocateRegistry.getRegistry("127.0.0.1",12346);
        IRemoteObj reobj = (IRemoteObj) registry.lookup("test");
        String s = reobj.sale("卖西瓜");//调用对象的sale方法,得到服务端的返回结果
        System.out.println(s);//打印返回结果

    }
}

注意

RMI机制客户端调用远程对象方法,实际上是客户端发送请求到服务端,由服务端执行代码,并将代码执行的结果返回给客户端。所以上述客户端需要接收服务端返回的结果并打印。(也就是RMI远程调用的方法其实是由服务端执行的

RMI调用过程使用网络传输,是通过序列化、反序列化进行的。

RMI是一个JVM远程调用另一个JVM的对象方法,服务端和客户端可以在两台不同的机器,也可以在同一机器的不同进程。

参考:

https://xz.aliyun.com/t/9261#toc-4

https://www.bilibili.com/video/BV1L3411a7ax?p=2&vd_source=772372a8c6f216ba8975276dca04045e