Java RPC(Remote Procedure Call)框架实现之Java RMI(Remote Method Invocation)
Java RMI是RPC标准实现的框架之一。和经典Socket编码模型类似,Java RMI首先在“服务器端”绑定一个域名地址,然后等待“客户端”查找服务器端的服务,然后调用服务器端对外暴露的接口。服务器端和客户端分别针对同一份相同的接口分别各自编程实现和调用。
服务器端和客户端共同使用的同一份接口文件。
先定义一个Java RMI中的接口文件,该接口文件一式两份被服务端和客户端分别使用:
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 接口定义的方法,必须抛出RemoteException
*/
public interface IMath extends Remote {
int sum(int a, int b) throws RemoteException;
}
简单的计算求和。该接口写好后分别放到客户端和服务器端。
服务器端:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MathImpl extends UnicastRemoteObject implements IMath {
protected MathImpl() throws RemoteException {
super();
}
@Override
public int sum(int a, int b) throws RemoteException {
return a + b;
}
}
private void test() {
try {
IMath math = new MathImpl();
int port = 9999;
Registry registry = LocateRegistry.createRegistry(port);
Naming.bind("rmi://localhost:9999/sum", math);
List<String> lists = Arrays.asList(registry.list());
for (String s : lists) {
System.out.println("服务已准备就绪 # " + s);
}
// 如果不想被继续被使用。
// UnicastRemoteObject.unexportObject(math, false);
} catch (Exception e) {
e.printStackTrace();
}
}
服务器端运行后:
服务已准备就绪 # sum
客户端:
private void test() {
//客户端调用服务端。
try {
IMath math = (IMath) Naming.lookup("rmi://127.0.0.1:9999/sum");
//调用服务器测试5轮。
for (int i = 0; i < 5; i++) {
int a = (int) (Math.random() * 10);
int b = (int) (Math.random() * 10);
System.out.println(a + " + " + b + " = " + math.sum(a, b));
}
} catch (Exception e) {
e.printStackTrace();
}
}
运行输出:
1 + 9 = 10
6 + 9 = 15
7 + 5 = 12
3 + 8 = 11
8 + 6 = 14