浏览 6448 次
锁定老帖子 主题:RMI简单应用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-20
最后修改:2009-12-23
实现RIM基本流程如下: 1.编写RIM功能接口,该接口必须扩展自java.rmi.Remote,而且接口中每一个方法都必须抛出一个java.rmi.RemoteException。例如: public interface Rem extends Remote { public String getMessage() throws RemoteException; } 2.编写RMI功能现实,通常RIM的实现是扩展自UnicastRemoteObject,并在构造函数中声明抛出一个java.rmi.RemoteException,例如: public class RemImpl extends UnicastRemoteObject implements Rem { private static final long serialVersionUID = 1L; //构造函数抛出RemoteException异常 public RemImpl() throws RemoteException {} //向RMI客户返回一个消息串 public String getMessage() throws RemoteException { return("Here is a remote message."); } } 3.编写服务端程序,先用java.rmi.registry.LocateRegistry在将要绑定对象的端口上创建一个注册器,然后设置虚拟机的安全管理器为RMISecurityManager,最后调用注册器的bind(String name,Remote object)或rebind(String name,Remote object)。例如: public class RemServer { public static void main(String[] args) { try { System.setProperty("java.security.policy","*.policy");//设置安全策略 RemImpl localObject = new RemImpl(); //生成远程对象实现的一个实例 Registry reg = LocateRegistry.createRegistry(8000); System.setSecurityManager(new RMISecurityManager()); reg.rebind("Rem", localObject); //将远程对象实例绑定到rmi:///Rem上 }catch(Exception ex){ ex.printStackTrace(); } }} 4.编写客户端程序,先使用java.rmi.Naming根据rmi协议在指定的计算机、端口和被绑定的对象名称lookup一个远程对象,然后调用该对象所提供的方法。例如: public static void main(String[] args) { try { String host = (args.length > 0) ? args[0] : "localhost"; //从命令行读取远程主机名 //通过URL在远程主机上查找对象,并把它转化为本地接口Rem类型 Rem remObject=(Rem)Naming.lookup("rmi://"+host + ":8000/Rem"); System.out.println(remObject.getMessage()); //调用远程对象的方法 } catch(RemoteException re) {System.out.println("RemoteException: " + re); } catch(NotBoundException nbe) {System.out.println("NotBoundException: " + nbe); } catch(MalformedURLException mfe){System.out.println("MalformedURLException:"+ mfe); }}} 此外,在调用方法方面可以用java的反射机制调用,还可以为RMI的连接上通keystore设置权限与加密。如: 通过RMISSLClientSocketFactory和RMISSLServerSocketFactory这两个接口,生成加密的SSLSocket和SSLServerSocket 在Remote的扩展接口的实现类中,这个实现中要扩展自UnicastRemoteObject,并在构造函数中调用父类参三个参数的构造函数,如: super(0, new RMISSLClientSocketFactory(), new RMISSLServerSocketFactory()); 再设置系统两个属性: System.setProperty("javax.net.ssl.keyStore", "server.keystore"); System.setProperty("javax.net.ssl.keyStorePassword", "server"); 最后也可以设置一下策略文件,这也是权限的设置。关于策略文件可以参考一下tomcat等服务器的策略文件。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-12-20
RIM? RMI? 名词都没搞明白吧
|
|
返回顶楼 | |
发表时间:2009-12-20
请先自己搞明白什么是RMI
RMI: Remote Method Invocation,远程方法调用 |
|
返回顶楼 | |
发表时间:2009-12-23
呵呵,打错字了
|
|
返回顶楼 | |
发表时间:2009-12-31
明知道打错字了还不编辑一下。。。。责任的不负
|
|
返回顶楼 | |