本文介绍的是使用JDK自带的RMI包,实现简单的远程方法调用功能,虽有众多局限,在生产环境上未必能用上,但对于理解原理是非常有好处的,请深刻理解。
说明:
1. 本文使用的是JDK1.6+的版本
2. 文中会使用到rmic功能,这个工具是在本地生成Stub和Skeleton的工具,在JAVA_HOME\bin文件中有自带,
若想使用,请在path环境变量中添加%JAVA_HOME%\bin 目的是将JAVA_HOME\bin下的命令添加到path变量中,
使得rmic命令在dos的任何目录下使用。
先上代码,服务端类:
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * UnicastRemoteObject 通过exportObject方法 将本实例export出去 * @author liuinsect * */ public class SayHello extends UnicastRemoteObject implements SayHelloInterface { // protected SayHello() throws RemoteException { super(); } /** * 序列化的标示 */ private static final long serialVersionUID = 999999L; /** * 在服务端的具体方法 */ @Override public void sayHello() { System.out.println(" hello "); } /** * 在服务端的具体方法 */ @Override public void sayHelloT0(String name) { System.out.println(" hello " + name); } }
import java.rmi.Remote; import java.rmi.RemoteException; /** * 作为标示,说明该接口支持远程调用 * @author liuinsect * */ public interface SayHelloInterface extends Remote { public void sayHello( ) throws RemoteException; public void sayHelloT0( String name) throws RemoteException; }
import java.rmi.*; /** * 服务端,完成的是发布服务的功能 * @author liuinsect * */ public class Server { public static void main(String[] args) { try { SayHelloInterface hello = new SayHello(); //实例化要发布的类 Naming.rebind("RMI_Hello", hello); //绑定RMI名称 进行发布,其实是将rmic生成的stub文件绑定待rmi registry中 System.out.println("=== Hello server Ready === "); } catch(Exception exception) { exception.printStackTrace(); } } }
客户端类:
import java.rmi.*; /** * 客户端类,调用远程服务 * @author liuinsect * */ public class Client { public static void main(String[] args) { try { //在RIM registry中需找名为RMI_Hello的服务 SayHelloInterface say = (SayHelloInterface) Naming.lookup("rmi://127.0.0.1/RMI_Hello"); //通过RMI名称查找远程对象 say.sayHello(); //调用远程对象的方法 ,这个时候的对象是在本地用classloader load进stub后,反序列化SayHelloInterface对象生成的 say.sayHelloT0("jack "); // } catch (Exception e) { e.printStackTrace(); } } }
编写好后,继续:
1. 在工程的bin文件下为SayHello.class生成stub类,即进入dos后cd到SayHello.class所在目录,
执行 rimc SayHello (注意,别加后缀)
2. 成功后,执行命令: rmiregistry 启动rmiregistry服务
3. 先运行server,再运行client 就可以了。。。