1 RMI 简介
RMI ,远程方法调用(Remote Method Invocation) 是Enterprise javaBeans的支柱,是建立分布式java应用程序的方便途径。RMI 是非常容易使用的,但是它也是非常强大的。RMI是基于接口,RMI 构架记入一个重要的原理:定义接口定义即可的具体实现是分开的,也就是面向接口编程。
2 RMI 的主要步骤:
(1) 创建远程接口及声明远程方法
(2) 实现远程接口及远程方法 (需要继承UnicastRemoteObject类)
(3) 启动RMI注解服务,并注册远程对象
(4) 客服端查找远程对象,并调用远程方法
(5) 运行测试
3 简单例子
服务端:
定义接口:
public interface RimMonitorService extends Remote {
public String interactive()throws RemoteException;
}
接口实现类
public class RimMonitorServerImpl extends UnicastRemoteObject implements RimMonitorService {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String interactive(int index) throws RemoteException {
switch(index){
case 1:
return "成功的!";
case 2:
return "失败的!";
}
return "";
}
public RimMonitorServerImpl() throws RemoteException {
super();
}
}
服务端注册:
public class RmiServer {
public String ip="localhost";
public int port=8889;
public void init(){
try {
LocateRegistry.createRegistry(port);
RimMonitorService rimMonitorService=new RimMonitorServerImpl();
Naming.bind("//"+ip+":"+port+"/com", rimMonitorService);
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
RmiServer server=new RmiServer();
server.init();
System.out.println("服务初始化成功!");
}
客服端
接口定义
public interface RimMonitorService extends Remote {
public String interactive(int index)throws RemoteException;
}
客服端调用
public class RimClient {
public String ip="localhost";
public int port=8889;
public RimMonitorService rimService;
public String interactive(int funindex) throws RemoteException{
rimService=getRimServer();
if(rimService!=null)
return rimService.interactive(funindex);
return "";
}
public RimMonitorService getRimServer(){
try {
rimService=(RimMonitorService)Naming.lookup("rmi://"+ ip+":"+port+"/com");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
return rimService;
}
public static void main(String[] args) {
RimClient client=new RimClient();
try {
System.out.println(client.interactive(1));
System.out.println(client.interactive(2));
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在这里需要 注意的是:客服端调用 可能会出现
java.lang.ClassNotFoundException: xx.xx(no security manager: RMI class loader disabled)
这里的接口所在的包必须和服务器所在的包名一样,同时接口名称也必须一样,