Java Rmi 简明教程

Java RMI Application

要编写 RMI Java 应用程序,您需要按照以下步骤进行操作 −

  1. Define the remote interface

  2. 开发实现类(远程对象)

  3. Develop the server program

  4. Develop the client program

  5. Compile the application

  6. Execute the application

Defining the Remote Interface

远程接口提供了特定远程对象的所有方法的描述。客户端与此远程接口进行通信。

要创建远程接口 −

  1. 创建一个扩展预定义接口 Remote (该接口属于此包)的接口。

  2. 在此接口中声明客户端可以调用的所有业务方法。

  3. 由于远程调用期间可能会出现网络问题,因此可能会出现名为 RemoteException 的异常;引发此异常。

以下是远程界面的示例。在这里,我们定义了一个名为 Hello 的界面,它有一个称为 printMsg() 的方法。

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

// Creating Remote interface for our application
public interface Hello extends Remote {
   void printMsg() throws RemoteException;
}

Developing the Implementation Class (Remote Object)

我们需要实现较早步骤中创建的远程界面。(我们可以单独编写一个实现类,或者我们可以直接让服务器程序实现此界面。)

要开发一个实现类 -

  1. 实现前一步骤中创建的界面。

  2. 为远程界面的所有抽象方法提供实现。

以下是实现类。在这里,我们创建了一个名为 ImplExample 的类,并实现了前一步骤中创建的界面 Hello 并为此方法提供了 body ,该方法打印一条消息。

// Implementing the remote interface
public class ImplExample implements Hello {

   // Implementing the interface method
   public void printMsg() {
      System.out.println("This is an example RMI program");
   }
}

Developing the Server Program

RMI 服务器程序应该实现远程界面或扩展实现类。在这里,我们应该创建一个远程对象并将它绑定到 RMIregistry

要开发一个服务器程序 -

  1. 创建一个客户端类,从中你可以调用远程对象。

  2. 在实例化实现类时通过 Create a remote object 调用它,如下所示。

  3. 使用属于包 java.rmi.server 的名为 UnicastRemoteObject 的类的 exportObject() 方法导出远程对象。

  4. 使用属于包 java.rmi.registryLocateRegistry 类的 getRegistry() 方法获取 RMI 注册表。

  5. 使用名为 Registry 的类的 bind() 方法将创建的远程对象绑定到注册表。对此方法,将表示绑定名称和已导出的对象的一个字符串作为参数传进来。

以下是 RMI 服务器程序的示例。

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

public class Server extends ImplExample {
   public Server() {}
   public static void main(String args[]) {
      try {
         // Instantiating the implementation class
         ImplExample obj = new ImplExample();

         // Exporting the object of implementation class
         // (here we are exporting the remote object to the stub)
         Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);

         // Binding the remote object (stub) in the registry
         Registry registry = LocateRegistry.getRegistry();

         registry.bind("Hello", stub);
         System.err.println("Server ready");
      } catch (Exception e) {
         System.err.println("Server exception: " + e.toString());
         e.printStackTrace();
      }
   }
}

Developing the Client Program

在其中编写一个客户端程序,用这个对象获取远程对象并调用所需的方法。

要开发一个客户端程序 -

  1. 创建一个客户端类,从中你打算调用远程对象。

  2. 使用属于包 java.rmi.registryLocateRegistry 类的 getRegistry() 方法获取 RMI 注册表。

  3. 使用属于包 java.rmi.registry 的类 Registrylookup() 方法从注册表中获取对象。对此方法,你需要将表示绑定名称的字符串值作为参数传入。这会返回远程对象。

  4. 查找() 返回一个远程类型的对象,将它向下转换为 Hello 类型。

  5. 最后使用获得的远程对象调用所需方法。

下面是一个 RMI 客户端程序示例。

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

public class Client {
   private Client() {}
   public static void main(String[] args) {
      try {
         // Getting the registry
         Registry registry = LocateRegistry.getRegistry(null);

         // Looking up the registry for the remote object
         Hello stub = (Hello) registry.lookup("Hello");

         // Calling the remote method using the obtained object
         stub.printMsg();

         // System.out.println("Remote method invoked");
      } catch (Exception e) {
         System.err.println("Client exception: " + e.toString());
         e.printStackTrace();
      }
   }
}

Compiling the Application

要编译应用程序-

  1. Compile the Remote interface.

  2. Compile the implementation class.

  3. Compile the server program.

  4. Compile the client program.

或者,

打开存储所有程序的文件夹,然后按如下所示编译所有 Java 文件。

Javac *.java
stored programs

Executing the Application

Step 1 - 使用以下命令启动 rmi 注册表。

start rmiregistry
start execution

这会在一个单独的窗口中启动一个 rmi 注册表,如下所示。

separate window

Step 2 - 按如下所示运行服务器类文件。

Java Server
run server

Step 3 - 按如下所示运行客户端类文件。

java Client
run client

Verification - 在启动客户端后,您很快就会在服务器中看到以下输出。

output