RMI


Java RMI 指的是远程方法调用 (Remote Method Invocation)。RMI能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法, 其威力体现在它强大的开发分布式网络应用的能力上,它可以被看作是RPC的Java版本。

与WebService相比,RMI编写代码更加简单,在小型应用开发上更加合适,相对地,RMI只能在java中使用,而WebSerce可以跨平台。

RMI示意图:

rmi

Demo

定义接口,必须继承Remote

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

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

实现接口,必须继承UnicastRemoteObject并在空构造中抛出RemoteException, 方法的返回值必须为原语类型或者序列化类型.

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

public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {

    protected HelloServiceImpl() throws RemoteException {}

    @Override
    public String sayHello() throws RemoteException {
        return "server says. 'Hey'";
    }
}

注册服务

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

public class RegistryBook {
    public static void main(String[] args) throws RemoteException, MalformedURLException {
        Registry r = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        r.rebind("HelloService", new HelloServiceImpl());
    }
}

在另一台虚拟机上运行客户端代码,需要获得服务接口文件

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

public class Client {
    public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException {
            HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:1099/HelloService");
            System.out.println(helloService.sayHello());
    }
}

注意,如果你使用的较为古老的jdk,你可能需要通过jdk内置的rmic命令生成stub以及skeleton文件,并将stub文件提供给客户端使用。