RMI简单应用

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等服务器的策略文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值