本文介绍的是使用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 就可以了。。。