RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
以下用一个最简单的示例来介绍RMI的应用
CircleInterface -------服务器接口类
Circle -------- 服务器类
CircleServer ---------服务器主类
TestCircle --------测试类
packagecom.same.demo03;
importjava.rmi.Remote;
importjava.rmi.RemoteException;
/**
*服务器接口
* Created by alic on 16-3-7.
*/
public interfaceCircleInterfaceextendsRemote {
public doublecircleArea(Double r)throwsRemoteException;
}
packagecom.same.demo03;
importjava.rmi.RemoteException;
importjava.rmi.server.UnicastRemoteObject;
/**
*服务器类
* Created by alic on 16-3-7.
*/
public classCircleextendsUnicastRemoteObjectimplementsCircleInterface {
protectedCircle()throwsRemoteException {
super();
}
@Override
public doublecircleArea(Double r)throwsRemoteException {
return3.14*r*r;
}
}
packagecom.same.demo03;
importjava.net.MalformedURLException;
importjava.rmi.AlreadyBoundException;
importjava.rmi.Naming;
importjava.rmi.RemoteException;
/**
*服务器主类
* Created by alic on 16-3-7.
*/
public classCircleServer {
public static voidmain(String[] args) {
try{
Circle circle =newCircle();
//通过rmi设置并绑定服务器端口
Naming.bind("rmi://localhost:1099/circle",circle);
System.out.println("CircleServer is ok");
}catch(RemoteException e) {
e.printStackTrace();
}catch(MalformedURLExceptione) {
e.printStackTrace();
}catch(AlreadyBoundException e) {
e.printStackTrace();
}
}
}
packagecom.same.demo03;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.rmi.Naming;
importjava.rmi.NotBoundException;
/**
*测试类
* Created by alic on 16-3-7.
*/
public classTestCircle {
public static voidmain(String[] args)throwsIOException, NotBoundException {
//连接服务器段的emi端口
CircleInterface circleInterface = (CircleInterface) Naming.lookup("rmi://localhost:1099/circle");
System.out.println("请输入半径:");
//创建输入流
BufferedReader bufferedReader =newBufferedReader(newInputStreamReader(System.in));
//将键盘输入的转换为Double类型
Double radii = Double.parseDouble(bufferedReader.readLine());
//接收通过服务器接口访问服务器计算的结果
System.out.println(circleInterface.circleArea(radii));
}
}
1、编写远程接口并编译
2、编写实现接口的服务器类并编译
3、使用rmic编译生成stub和skeleton,命令格式:
rmic -v1.2 服务器类名
4、编写服务器主类并编译
5、编写客户端类并编译
6、启动注册库命令:
Window下 : start rmiregistry 1099
Linux下:rmiregistry 1099
7、运行服务主类: java 服务器主类名
8、再重新启动一个命令行窗口,运行客户类: java 客户端类名