使用rmi进行远程调用

rmi在jdk1.5之前使用是非常复杂的,需要做6个步骤:1.定义和实现远端接口中的参数。2.定义和实现远程接口。3.编写服务端代码。4.编写客户端代码。5.生成stub和skeltion,并将stub打包到客户端jar中,将skeltion打包到服务端jar中。6.启动rmiregistry,并将服务注册到rmiregistry中,然后运行代码。还需要执行一些命令行程序,非常复杂。

在jdk1.5中,使用了动态代理技术,实现了动态生成stub和skeltion类,从而省去了相当多的繁琐工作,rmi的创建和发布已经变得非常简单。

只需以下四个步骤:

第一、创建接口,必须继承Remote接口

import java.rmi.*;    

/**   
 * 远程接口必须扩展接口java.rmi.Remote   
 */   
public interface HelloInterface extends Remote    
{    
   /**   
    * 远程接口方法必须抛出 java.rmi.RemoteException   
    */   
   public String say() throws RemoteException;    
} 

 

 第二、创建业务类,此类必须实现上面定义的接口和实现UnicastRemoteObject接口

import java.rmi.*;    
import java.rmi.server.*;    
   
/**   
 * 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface   
 */   
public class Hello extends UnicastRemoteObject implements HelloInterface    
{    
   private String message;    
   
   /**   
    * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常   
    */   
   public Hello(String msg) throws RemoteException    
   {    
      message = msg;    
   }    
   
   /**   
    * 远程接口方法的实现   
    */   
   public String say() throws RemoteException    
   {    
      System.out.println("Called by HelloClient");    
      return message;    
   }    
} 

 

 第三、服务端将需要发布出去的服务使用rmi进行注册,以便客户端可以查找到相应服务。

import java.rmi.Naming;    
import java.rmi.registry.LocateRegistry;    
   
public class HelloServer    
{    
   /**   
    * 启动 RMI 注册服务并进行对象注册   
    */   
   public static void main(String[] argv)    
   {    
      try   
      {    
         //启动RMI注册服务,指定端口为1099 (1099为默认端口)    
         //也可以通过命令 $java_home/bin/rmiregistry 1099启动    
         //这里用这种方式避免了再打开一个DOS窗口    
         //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用    
         LocateRegistry.createRegistry(1099);    
            
         //创建远程对象的一个或多个实例,下面是hello对象    
         //可以用不同名字注册不同的实例    
         HelloInterface hello = new Hello("Hello, world!");    
            
         //把hello注册到RMI注册服务器上,命名为Hello    
         //Naming.rebind("Hello", hello);    
             
         //如果要把hello实例注册到另一台启动了RMI注册服务的机器上    
         Naming.rebind("//192.168.61.113:1099/Hello",hello);    
            
         System.out.println("Hello Server is ready.");    
      }    
      catch (Exception e)    
      {    
         System.out.println("Hello Server failed: " + e);    
      }    
   }    
}   

 

 第四、客户端通过java.rmi.Naming进行查找自己需要的服务,查找到之后就可以像使用本地对象一样使用远程对象。

import java.rmi.Naming;    

public class HelloClient    
{    
   /**   
    * 查找远程对象并调用远程方法   
    */   
   public static void main(String[] argv)    
   {    
      try   
      {    
         //HelloInterface hello = (HelloInterface) Naming.lookup("Hello");    
             
         //如果要从另一台启动了RMI注册服务的机器上查找hello实例    
         HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.61.113:1099/Hello");    
             
         //调用远程方法    
         System.out.println(hello.say());    
      }    
      catch (Exception e)    
      {    
         System.out.println("HelloClient exception: " + e);    
      }    
   }    
}    

 

 现在的rmi就是这么简单,而rmi是一切远程调用的核心,ejb也只不过是对rmi进行了包装而已。通过以上步骤,您就可以发布属于自己的rmi系统。

你可能感兴趣的:(java,工作,ejb,dos)