📜  讨论Java RMI(1)

📅  最后修改于: 2023-12-03 14:57:36.506000             🧑  作者: Mango

Java RMI

Java RMI(Java Remote Method Invocation)是一种实现分布式应用程序的Java API。通过RMI,程序员可以编写分布式应用程序,使一个Java虚拟机上的对象调用另一个Java虚拟机上的对象的方法就像调用本地对象的方法一样。RMI为开发分布式应用程序提供了方便的方式,无论是在LAN还是在Internet上。

RMI的特点和优势
  • 提供了对于使用远程对象进行方法调用的便捷支持
  • 通过Java虚拟机的序列化机制使远程调用也不需要关注网络传输问题
  • 具有多点访问权限控制和基于Java的安全控制
  • 对于线程同步和并发操作提供充分支持
RMI的工作流程

RMI实现了Java对象在远程主机间的直接传输,其通讯的过程简化如下:

  • 通过RMI注册表,远程主机获取到一个远程对象的引用
  • 远程主机调用远程对象的方法,并将远程调用传递给远程对象所在的主机
  • 远程主机等待远程调用结果,最终获得结果后返回给本地调用者
RMI技术实现

RMI技术工作主要涉及到Remote接口、Stub类和Skeleton类。

Remote接口是实现分布式对象的基础。RMI技术的所有分布式对象都继承自Remote接口。Stub类和Skeleton类则分别作为远程调用客户端和服务端的承载实现,负责对象的网络通讯和处理远程调用请求。

客户端利用Stub类作为代理访问远程对象,服务端利用Skeleton类接收并处理远程对象的调用请求,这两种类的实现是由RMI系统自动生成的。同时,RMI技术还支持针对传输协议、网络优化、安全验证等方面的相关配置实现。

RMI的使用

使用RMI时需要注意以下几点:

  • 定义Remote接口
  • 实现Remote接口
  • 在服务端启动RMI注册表
  • 实现服务端调用
  • 在客户端中获取远程对象
  • 通过Stub类的方法调用服务端方法
RMI实例

下面是RMI实例的服务端和客户端代码片段

服务端代码
public interface HelloInterface extends Remote {
    public String sayHello() throws RemoteException;
}

public class HelloImpl extends UnicastRemoteObject implements HelloInterface {
    public String sayHello() throws RemoteException {
        return "Hello World";
    }
}

public class HelloServer {
    public static void main(String args[]) {
        try {
            Registry registry = LocateRegistry.createRegistry(1199);
            registry.rebind("hello", new HelloImpl());
            System.out.println("HelloServer is ready.");
        } catch (RemoteException e) {
            System.out.println("HelloServer exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
客户端代码
public class HelloClient {
    public static void main(String args[]) {
        try {
            String name = "rmi://localhost:1199/hello";
            HelloInterface hello = (HelloInterface) Naming.lookup(name);
            System.out.println("Lookup completed " );
            System.out.println(hello.sayHello());
        } catch (Exception e) {
            System.out.println("HelloClient exception: " + e);
        }
    }
}

其中,服务端提供了对HelloInterface接口的实现HelloImpl类,并将其通过RMI注册表绑定,客户端则是通过RMI的Naming类获取服务端的远程对象,并调用其方法。