您的位置:首页 > 编程语言 > Java开发

JAVA 自带的RMI远程调用功能的实现和原理

2013-02-25 19:46 831 查看
本文介绍的是使用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  就可以了。。。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: