📜  Java RMI-简介(1)

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

Java RMI简介

Java Remote Method Invocation(简称Java RMI)是一种Java编程语言机制,可以用于实现分布式应用程序。

什么是Java RMI?

Java RMI 是Java中用于实现远程过程调用的机制,允许客户端程序通过网络访问远程服务器上的对象。简而言之,它是Java为了方便程序员编写分布式应用程序而提供的API。

RMI提供了一种在远程计算机上执行Java方法的简单机制,因此,您可以使用它来实现以不同方式连接到的对象。它可以应用于从简单的客户端/服务器结构到大型的分布式系统。

RMI的优点

使用Java RMI有以下优点:

  • 可以使您的应用程序尽可能地透明,因为客户端代码可以在RMI中调用远程对象的方法。

  • 使代码易于编写,因为您只需要提供用于创建共享对象的Java接口。

  • 可以让您可以将对象分布在多台计算机上,同时也可以执行负载平衡和故障转移。

  • 可以使您的应用程序具有更高的可扩展性。

RMI的缺点

当然,使用RMI也有缺点:

  • RMI有相当于使用Java原语的开销,这意味着如果需要使用大量数据,它可能会变得缓慢。

  • RMI需要Java编程语言才能编写(这也可以归类为优点)。虽然您可以使用Java编写客户端软件,但从其他编程语言的应用程序访问RMI对象会变得更加困难。

RMI的基本概念

为了使您熟悉Java RMI,以下是一些相关的基本概念:

远程接口

这是您需要实现的Java接口。任何客户端都可以调用这个接口中定义的方法。这个接口必须扩展Remote接口。

远程对象

这是实现了远程接口的Java类的对象。这个对象必须扩展UnicastRemoteObject类。

Registry

Registry对象可用于在网络上查找对象,这个对象支持查找功能,使用Registry.bind()方法向远程对象绑定一个名称。

Stub

Stub是客户端中的一个代理对象,它被用于执行远程方法调用。

Skeleton

骨架是服务器上的一个代理对象,它用于从Stub接收远程方法调用并将它们分派到相关的对象。

代码示例

以下是一个简单的Java RMI示例程序:

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld {
    private static final long serialVersionUID = 1L;

    protected HelloWorldImpl() throws RemoteException {
        super();
    }

    @Override
    public String sayHello() throws RemoteException {
        return "Hello, World!";
    }

    public static void main(String[] args) throws Exception {
        try {
            Registry registry = LocateRegistry.createRegistry(1099);
            registry.bind("HelloWorld", new HelloWorldImpl());
            System.out.println("Server ready");
        } catch (Exception e) {
            System.out.println("Server exception: " + e.toString());
        }
    }
}

interface HelloWorld extends Remote {
    public String sayHello() throws RemoteException;
}

public class HelloWorldClient {
    public static void main(String[] args) throws Exception {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost",1099);
            HelloWorld stub = (HelloWorld) registry.lookup("HelloWorld");
            String response = stub.sayHello();
            System.out.println(response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

该示例程序定义了一个HelloWorld接口和一个HelloWorldImpl类来实现该接口。在接口中,我们定义了一个Simple API“sayHello”方法,它返回字符串“Hello,World!”。主要的例程创建了一个RMI注册表,并将实现接口的远程对象绑定到名称“HelloWorld”。客户端通过寻找该对象的名称,并调用它的Simple API。