什么是RMI?
RMI(Remote Method Invocation)是Java的一种机制,允许在不同Java虚拟机(JVM)上运行的对象之间进行远程方法调用。RMI使得开发分布式应用程序变得更加简单,因为它允许开发者像调用本地对象一样调用远程对象的方法。
远程对象:在RMI中,远程对象是指可以被远程调用的对象。它们实现了一个或多个远程接口。
远程接口:远程接口定义了可以被远程调用的方法。它必须扩展java.rmi.Remote
接口,并且每个方法都必须抛出java.rmi.RemoteException
。
存根(Stub)和骨架(Skeleton):存根是客户端与远程对象之间的代理,负责将调用请求发送到服务器。骨架是服务器端的组件,负责接收请求并调用实际的远程对象方法。在Java 2及以后的版本中,骨架不再需要,因为RMI的实现已经简化。
RMI注册表:RMI注册表是一个简单的命名服务,允许客户端查找远程对象。远程对象在注册表中以名称进行注册,客户端可以通过名称查找并获取远程对象的存根。
以下是一个简单的RMI示例,展示了如何创建和使用RMI。
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class HelloImpl extends UnicastRemoteObject implements Hello {
protected HelloImpl() throws RemoteException {
super();
}
@Override
public String sayHello() throws RemoteException {
return "Hello, world!";
}
}
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIServer {
public static void main(String[] args) {
try {
HelloImpl obj = new HelloImpl();
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("Hello", obj);
System.out.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIClient {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
Hello stub = (Hello) registry.lookup("Hello");
String response = stub.sayHello();
System.out.println("Response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
编译所有Java文件:
javac *.java
启动RMI注册表:
rmiregistry
启动RMI服务器:
java RMIServer
启动RMI客户端:
java RMIClient
RMI是Java提供的一种强大机制,允许在不同的JVM之间进行远程方法调用。通过定义远程接口、实现远程对象、创建RMI注册表和客户端查找远程对象,开发者可以轻松构建分布式应用程序。RMI的使用场景包括分布式计算、远程服务调用等。