java_rmi初试验

13年前
   最近不知道咋的,学习精神很佳,学习了一下java_rmi,学的不是很深,自己动手写了小程序,
实现的功能 是在本机  编写rmi服务端 和客户端 ,然后运行,看看运行效果
rmi:远程调用方法,rmi本质上也是sock通信哦,这个看jdk源码就知道
实现rmi,分下面几步
rmi接口,要extends jdk中的 Remote 接口,extends 接口Remote的类就是远程的服务接口,
对远程服务接口的实现 ,就是我们调的远程服务接口了哦,但是 要extends  UnicastRemoteObject 类,为什么呢你,看jdk源码知道,UnicastRemoteObject   类帮我们实现了Remote需要的一些机制,
      看服务端的代码:
继承远程接口:
     public interface ServiceRmi  extends Remote{
      public String getName() throws RemoteException;     
      public Object getObject() throws RemoteException;
}
   对远程接口的实现:
public class ServiceRmiImpl extends UnicastRemoteObject implements ServiceRmi {
 
 int i=0;
 int j=0; 
 public ServiceRmiImpl()  throws RemoteException
 {  
 }
 
 /**  
  * @Function: ServiceRmiImpl.java
  * @Description: 该函数的功能描述
  *
  * @return
  * @throws RemoteException
  * @return:返回结果描述
  * @throws:异常描述
  *
  * @version: v1.0.0
  * @author: 浪子
  * @date: 2011-8-19 下午04:56:52
  *
  * Modification History:
  * Date         Author          Version            Description
  *---------------------------------------------------------*
  * 2011-8-19     浪子           v1.0.0               修改原因
  */
 public String getName() throws RemoteException {
   System.out.print("call this getName");
    i=i+1;  
  System.out.print("call this getName="+i); 
  return "testName";
 }
 /**  
  * @Function: ServiceRmiImpl.java
  * @Description: 该函数的功能描述
  *
  * @return
  * @throws RemoteException
  * @return:返回结果描述
  * @throws:异常描述
  *
  * @version: v1.0.0
  * @author: 浪子
  * @date: 2011-8-19 下午04:56:52
  *
  * Modification History:
  * Date         Author          Version            Description
  *---------------------------------------------------------*
  * 2011-8-19     浪子           v1.0.0               修改原因
  */
 public Object getObject() throws RemoteException {  
   Object o=new Object();  
  return o;
 }
 
服务端启动:
public class Service {
 public static void main(String []args) throws RemoteException,Exception
 {
//下面这个是 注册1099,不然还要生成stub,等2个文件,要用的jdk自带的 rmic命令生成,但是我试验没成功
stub,就像两个proxy文件,客户端从是和stub文件通信,再调服务端
  LocateRegistry.createRegistry(1099);
    ServiceRmi service=new ServiceRmiImpl();
下面这个是用的jdk中的Naming,绑定url,和Remote对象
url: 是IP地址加上端口号加上服务名 ,默认的端口是1099
  Naming.rebind("//127.0.0.1/service", service);  
 } 
}
客户端调用:
public class ClientRmi  { 
 public static void main(String []args) throws Exception
 {
  String name="//127.0.0.1:1099/service";
  //服务端注册了name,在客户端查出来
    ServiceRmi service=(ServiceRmi)Naming.lookup(name);
    System.out.println(service.getName());   
 }
}
 
就这样实现了远程调用,从代码反应来看,客户端调用,就像是在本地调用一样,
但是rmi  只能和java进行通信,比如1个平台是 C++写的,就有力不从心了哦,那就只能用webService,或者cobar ,