设计模式——代理模式(RMI初接触)

在学习HeadFirst的代理模式时,第一次接触到RMI(Remote Method Ivcation)时发现自己的java基础有很大的不足,主要是在命令模式下运行java程序,以及相关的一些设置。
RMI提供客户辅助和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。
这里主要介绍利用RMI制作远程服务
分为五个步骤:
1.制作远程接口:远程接口定义出客户远程调用的方法。客户将用它作为服务的类类型。Stub(桩)和实际的服务都实现此接口。
详细过程:制作远程接口要求我们扩展一个记号接口Remote
public interface MyRemote extends Remote{
public String sayHello() throes RemoteException;
}
这里每次调用远程方法都是有风险的,所以要抛出可能存在的异常。并且我们要确定返回的变量属于原语或者可序列化(Serializable)
让一个类型可序列化很简单。只要让它继承Serializable类,如:
public interface State extends Serializable

2.制作远程的实现,这是做实际工作的类,为远程接口中的方法提供了真正的实现。这就是客户真正想调用的方法。
详细:远程 服务类必须实现远程接口,也就是客户将要调用的方法的接口
public class RemoteService extends UnicastRemoteObject implements MyRemote{
public String sayHello(){
return “hello java”;
}
}
extends UnicastRemoteObject:为了要成为远程服务对象,你的对象需要某些远程功能,最简单的方式是扩展java.rmi.server.UnicastRemoteObject,让超类帮你做这些事情
这时我们拥有了一个远程服务了,必须让他能够被客户端调用。先实例化服务,让后放进RMI registry中(先要确保RMI registry正在运行)

try{
  MyRemote myRemote=new RemoteServer();
  Naming.rebind("name",myRemote);
  }

我们使用Naming.rebind()方法注册服务,客户端使用Naming.lookup()获取远程服务Stub。

3.利用rmi产生的Stub和skeleton
产生Stub和skeleton,在命令行下执行语句(注意要到类文件存放的位置)
这里写图片描述
第一条红线是我的类文件的存放位置,第二条文件是包路径下的远程服务类文件,然后会在目录下自动生成一个文件(以_stub.class结尾) 如图:
这里写图片描述

这就是客户和服务的辅助类。不需要自己创建这些类,甚至连生成他们的代码都不用看。运行rmic工具时,这都会自动处理
4.启动RMI registry
这里写图片描述

5.开始远程服务
在客户端启动远程服务,首先取得远程的stub,用MyRmote myremote =Naming.lookup(“rmi://ip//name”)取得一个远程调用接口,替换ip和注册的名称name。然后可以用myRemote 调用方法(相当于调用远程的服务对象)

这里有三个要注意的地方:
1.启动远程服务之前一定要先启动rmiregistry,用Naming.rebind()注册服务时,rmiregistry 是必须启动的
2.远程接口方法返回的对象类型必须是可序列化的
3.要给客户提供stub类(要先运行rmic 服务类 这条语句自动生成_stub类,注意一定要到项目的bin文件目录下运行)

你可能感兴趣的:(设计模式)