论坛首页 入门技术论坛

RMI简单应用

浏览 6448 次
锁定老帖子 主题:RMI简单应用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-20   最后修改:2009-12-23
Java RMI技术API在java.rim包及其了包中,其基本思想是将一个封装有特殊方法的对象绑定到一个端口上,等待其他计算机的调用这个对象上的方法。
实现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等服务器的策略文件。

   发表时间:2009-12-20  
RIM? RMI? 名词都没搞明白吧
0 请登录后投票
   发表时间:2009-12-20  
请先自己搞明白什么是RMI
RMI: Remote Method Invocation,远程方法调用
0 请登录后投票
   发表时间:2009-12-23  
呵呵,打错字了
0 请登录后投票
   发表时间:2009-12-31  
明知道打错字了还不编辑一下。。。。责任的不负
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics