RMI 开发方法
RMI 开发步骤
开发RMI步骤:
1.编写服务接口,此接口须直接或间接继承至Remote接口,且此服务接口中的所有方法必须声明抛出受查RemoteException异常.
2.编写服务接口的实现类,继承UnicastRemoteObject,并实现服务接口.UnicastRemoteObject是一个用于构建RMI Server的便利基类,它可以处理大部分服务器创建的工作,如当调用其构造函数时,将自动创建Socket,并在给定的端口上监听客户端的请求.
3.使用rmic生成此实现类的stub(存根)和skeleton(骨架)
如何生成stub请参见本人的另一篇文章:JDK1.6 rmic命令使用
4.创建一个服务器,用于发布2中写好的类
5.创建一个客户程序进行RMI调用
开发RMI步骤:
1.编写服务接口,此接口须直接或间接继承至Remote接口,且此服务接口中的所有方法必须声明抛出受查RemoteException异常.
package com.pa.rmi.test; import java.rmi.Remote; public interface BaseRemoteInterface extends Remote { }
2.编写服务接口的实现类,继承UnicastRemoteObject,并实现服务接口.UnicastRemoteObject是一个用于构建RMI Server的便利基类,它可以处理大部分服务器创建的工作,如当调用其构造函数时,将自动创建Socket,并在给定的端口上监听客户端的请求.
package com.pa.rmi.test.upload; import java.rmi.RemoteException; import com.pa.rmi.test.BaseRemoteInterface; public interface FileUploadHandler extends BaseRemoteInterface{ public boolean upload(String src,String dest)throws FileUploadException,RemoteException; }
3.使用rmic生成此实现类的stub(存根)和skeleton(骨架)
如何生成stub请参见本人的另一篇文章:JDK1.6 rmic命令使用
4.创建一个服务器,用于发布2中写好的类
package com.pa.rmi.test; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import com.pa.rmi.test.upload.FileUploadHandler; import com.pa.rmi.test.upload.FileUploadHandlerImpl; public class RMIRegistHelper { public static void regist(Remote remoteObject, String name,Integer port ) { try { if(port==null||port==0){ port = 1099; } LocateRegistry.createRegistry(port); Naming.bind("rmi://localhost:"+port+"/" + name, remoteObject); System.out.println(name+" bound successful,listen on port :"+port); } catch (RemoteException e) { } catch (AlreadyBoundException e) { } catch (MalformedURLException e) { } } public static void main(String args[]) throws Exception { FileUploadHandler handler = new FileUploadHandlerImpl(); regist(handler,"fileUploadHandler",null); } }
5.创建一个客户程序进行RMI调用
package com.pa.rmi.test.upload; import java.net.MalformedURLException; import java.rmi.*; public class ClientTest { public static void main(String args[]) { try { // 在RMI服务注册表中查找名称为fileUploadHandler的对象,并调用其上的方法 FileUploadHandler fileUploadHandler = (FileUploadHandler) Naming.lookup("rmi://localhost:1099/fileUploadHandler"); System.out.println(fileUploadHandler.upload("","")); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (FileUploadException e) { e.printStackTrace(); } } }
1 楼
shaoxuexue86
2012-08-03
请问客户端程序ClientTest 与 RMIRegistHelper 是在一个项目当中吗? 不然是怎么引入FileUploadHandler 的呢?如果是在不同的项目中是不是把FileUploadHandler 这个半制品类也要拷到另一个项目当中?我是这样做的不确定这样做是不是对的?谢谢
2 楼
huxiaojun_198213
2012-08-04
RMIRegistHelper只是负责注册远程对象,与客户端所处的位置并无关系。FileUploadHandler是远程接口,客户端要调用远程对象的方法,必须通过远程接口来操作(远程对象是没有向客户端暴露的),因此在客户端测试中,必须将远程接口放在客户端的classpath中。
3 楼
shaoxuexue86
2012-08-24
谢谢啊