📜  Java RMI应用程序(1)

📅  最后修改于: 2023-12-03 15:01:32.010000             🧑  作者: Mango

Java RMI应用程序

Java RMI(远程方法调用)是一种Java平台的远程级别方法调用解决方案。它使客户端应用程序能够通过网络与远程对象通信并执行方法调用。使用Java RMI,您可以创建跨越网络的分布式应用程序。

RMI基础

Java RMI包含服务器和客户端之间远程调用传递序列化的Java对象。它有三个工作部分:

  1. 远程接口定义
  2. 实现远程接口的类
  3. 注册一个远程服务
远程接口定义

远程接口定义是用于实现RMI的Java接口规范,在实现RMI之前,必须先定义远程接口。远程接口定义类似于本地接口定义。

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

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

这个远程接口定义了一个sayHello方法,返回一个字符串。这个接口继承自Remote接口,全部方法必须抛出RemoteException异常。

实现远程接口的类

实现远程接口的类提供了远程方法的实现。这个类要实现定义的远程接口和方法。

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

public class MyObject extends UnicastRemoteObject implements MyInterface {
    public MyObject() throws RemoteException {}

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

这个类扩展UnicastRemoteObject类,以便成为可远程调用的对象。实现了定义的MyInterface接口,并实现了sayHello方法。

注册一个远程服务

为了使客户端应用程序能够调用远程方法,您需要在服务器上创建一个远程对象并将其注册到RMI注册表中。RMI注册表使客户端可以通过查找注册表并读取注册远程对象的绑定信息来引用远程对象。

以下是一个简单的注册一个远程服务的例子:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class MyServer {
    public static void main(String[] args) {
        try {
            MyObject obj = new MyObject();
            Naming.rebind("MyObject", obj);
            System.out.println("MyObject bound in registry");
        } catch (RemoteException | MalformedURLException e) {
            System.out.println("MyObject error: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

这个服务器创建了一个MyObject对象,并使用Naming类的静态方法rebind方法将它绑定到RMI注册表中。客户端可以使用绑定名MyObject来检索此远程对象。

RMI客户端

客户端从服务器检索远程对象的引用,就像从类对象一样。经过此引用,您可以调用远程对象中公开的方法,并将其视为本地对象的方法。

以下是一个简单的客户端例子:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class MyClient {
    public static void main(String[] args) {
        try {
            MyInterface obj = (MyInterface) Naming.lookup("//localhost/MyObject");
            String result = obj.sayHello();
            System.out.println(result);
        } catch (MalformedURLException | RemoteException | NotBoundException e) {
            System.out.println("MyObject error: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

这个客户端使用Naming类的静态方法lookup方法检索了名为"//localhost/MyObject"的远程对象。它强制转换返回的远程对象为MyInterface接口,并调用它的sayHello方法,并打印方法返回值。

总结

Java RMI可让客户端应用程序通过网络请求远程对象,并使其具有调用远程对象的能力。通过定义远程接口、实现远程对象的类和注册远程服务的方式,可以使用Java RMI创建出分布式的应用程序。