注:转载于http://www.blogjava.net/hubin/archive/2008/04/14/171116.htmlhtml
在开始写例子以前仍是先,了解一下RMI的相关知识.
什么是RMI
远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,
使用这种机制,某一台计算机上的对象在调用另一台计算机上的方法时,使用的程
序语法规则和在本地机上对象间的方法调用的语法规则同样。java
优势
这种机制给分布计算的系统设计、编程都带来了极大的方便。
只要按照RMI规则设计程序,能够没必要再过问在RMI之下的网络细节了,如:TCP和Socket等等。
任意两台计算机之间的通信彻底由RMI负责。调用远程计算机上的对象就像本地对象同样方便。
一、面向对象:
RMI可将完整的对象做为参数和返回值进行传递,而不只仅是预约义的数据类型。
也就是说,能够将相似Java哈西表这样的复杂类型做为一个参数进行传递。
二、可移动属性:
RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
三、设计方式:
对象传递功能使您能够在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
若是用户可以传递属性,那么就能够在本身的解决方案中使用面向对象的设计方式。
全部面向对象的设计方式无不依靠不一样的属性来发挥功能,若是不能传递完整的对象——包括实现和类型
——就会失去设计方式上所提供的优势。
四、安全性:
RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
五、便于编写和使用
RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工做变得轻松、简单。
远程接口实际上就是Java接口。
为了实现RMI的功能必须建立远程对象任何能够被远程调用的对象必须实现远程接口。但远程
接口自己并不包含任何方法。于是须要建立一个新的接口来扩展远程接口。
新接口将包含全部能够远程调用的方法。远程对象必须实现这个新接口,因为新的接口扩展了
远程接口,实现了新接口,就知足了远程对象对实现远程接口的要求,所实现的每一个对象都将
做为远程对象引用。
我的总结:
RMI说白了,就是提供了一种远程的方法调用。 这种调用简单方便,能够传递复杂java对象。如今流行的j2ee中的EJB的底层实现技术就是RMI,EJB的调用就是通过封装的,更高级的RMI调用。编程
下面咱们就来写一个RMI的程序:
前提:小程序
在Eclipse中装入RMI插件(从附件下载)。下载解压后将features和 plugins分别拷到eclipse的对应文件夹中,而后重启Eclipse,最好能在cmd窗口中加上 -clean启动。安全
一.建立RMI程序的6个步骤:
1.定义一个远程接口
2.实现这个远程接口
3.开发服务器
4.开发客户机
5.生成存根和基干,启动RMI注册表、服务器和客户机 (可在dos中用rmic生成存根和基干)
二. 程序详细说明服务器
先建一个java工项"rmiDemo1"(个人是I:\codeDemo\elispe\rmidemo1\rmiDemo1,在这里要特别注意的存放目录)
1.定义一个远程接口的接口,该接口中的每个方法必须声明它将产生一个RemoteException异常。网络
import java.rmi.Remote;
import java.rmi.RemoteException;app
public interface SayHello extends Remote {//须要从Remote继承
public String sayHello(String info)throws RemoteExceptio //须要抛出remote异常n;eclipse
}分布式
二、定义一个实现该接口的类。
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class SayHelloImpl extends UnicastRemoteObject implements SayHello {
protected SayHelloImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
public String sayHello(String info) throws RemoteException {
return "hello="+info;
}
}
实现接口的类必须继承UnicastRemoteObject类。
扩展java.rmi.server.UnicastRemoteObject
UnicastRemoteObject顾名思义,是让客户机与服务器对象实例创建一对一的链接。
3.生成程序的根文件
在rmiDemo1上单击右键,选择RMI--Enable Stubs Generation,自动会在bin/文件夹中生成SayHelloImpl_Stub.class。
4.建立服务器类
import java.rmi.*;
import java.net.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class SayRmiServer {
public SayRmiServer() {
}
public static void main(String args[]) throws RemoteException, MalformedURLException {
SayHelloImpl add = new SayHelloImpl();
Naming.rebind("addnumbers", add);
}
}
5.建立Client类
import java.rmi.*;
import java.net.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class SayRmiClient {
public SayRmiClient() {
}
public static void main(String args[]) throws RemoteException,
MalformedURLException, NotBoundException {
String url = "rmi://127.0.0.1/addnumbers";
SayHello add = (SayHello) Naming.lookup(url);
String result = add.sayHello("hubin");
System.out.println(result);
}
}
三.运行调试项目
在运行以前须要进行一下设置,不然,会提示错误信息,说找不到stub类。
一、启动RMIRegistry
Eclipse菜单window->show view->others,在弹出菜单中选择RMI Views->RMI Registry Inspector,这是会多出来一个窗口,这里能够显示已经注册的RMI应用。
点击工具条上的RMI Plugin图标,在菜单中选择Start Local Registry。
在 运行-->cmd--->cd 进入你项目生成class文件所在目录,如个人是( cd I:\codeDemo\elispe\rmidemo1\rmiDemo1\bin,在当前目录下,直接运行rmiRegistry命令),若是不在存处注 册,你的服务会老是联结不上的.
注意这个只须要启动一次,除非你把它关掉。
二、配置运行RMI服务
右键点击左边树中的RMI_Server.java文件,菜单Debug As ->RMI Application。在弹出对话框中找到RMI Properties标签页。
这时这里前两项显示红色。
选中java.security.police项的value框,点击选择按钮会出现文件选择对话框,咱们这里设置成C:\Java \jre1.5.0_05\lib\security\java.security。就是jre的安全策略配置文件,要选择成泥当前用的jdk的侧略文 件。
选中第二项java.rmi.server.codebase的value项,这里选择编译后类包所在的文件夹。点击选择按钮->add按钮 ->pick from workspace,选择当前工程RMITest的bin文件夹。这里是file:/I:\codeDemo\elispe\rmidemo1 \rmiDemo1\bin。
点击apply按钮。
点击debug按钮。
4.单击RmiServer选择Run as--RMI Application 5.单击RmiClient选择Run as--Java Application