Java RMI
介绍
Java RMI(Java Remote Method Invocation) Java 远程方法调用
允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。通俗来说就是 A 机器上的 class 可以调用 B 机器上的 class 中的方法。
作用
为分布式 Java 应用程序之间的远程通信提供服务
例子
首先我这里新建了两个 project,一个是服务端,一个是客户端。服务端提供远程服务供客户端调用。话不多说,直接上代码!
服务端:
- 定义一个 Hello 接口实现 Remote 接口
package com.carl.hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
// 远程接口中方法声明时必须抛出 RemoteException 或它的超类
String sayHello() throws RemoteException;
}
- 定义实现类实现 Hello 接口
package com.carl.hello;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements Hello {
private String message;
// 必须写出构造方法并抛出 RemoteException,无参构造也必须声明出来且抛出异常
public HelloImpl(String message) throws RemoteException {
this.message = message;
}
@Override
public String sayHello() {
System.out.println("================> SayHello is Called");
return message;
}
}
- 最后写一个类将接口注册到注册表中
package com.carl;
import com.carl.hello.Hello;
import com.carl.hello.HelloImpl;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class HelloServer {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.createRegistry(8080);
Hello hello = new HelloImpl("hello world !");
registry.bind("hello", hello);
System.out.println("Registry success...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
到这里服务端就写完了…
客户端:
- 定义客户端接口
package com.carl.hello;
// 包名必须和服务端一样,否则报错
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
- 定义一个类获取远程服务接口
import com.carl.hello.Hello;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class HelloClient {
public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
Registry registry = LocateRegistry.getRegistry("localhost", 8080);
Hello hello = (Hello) registry.lookup("hello");
System.out.println(hello.sayHello());
}
}
到这里所有代码就写完啦~
先运行服务端,再运行客户端
输出结果:
局限
RMI 使用的是 Java 远程消息交换协议 JRMP(Java Remote Messaging Protocol)进行通信,这是专门为 Java 远程对象调用制定的协议,不适合非 Java 语言