RMI实例参考模板_第1页
RMI实例参考模板_第2页
RMI实例参考模板_第3页
RMI实例参考模板_第4页
RMI实例参考模板_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2009-10-22RMI实例1 / 9Remote Method Invocation (RMI - Java远程方法调用)允许您使用Java编写分布式对象。本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中,以及与用Java 编写的组件的连接,同时给出了一个详细的例子,可以给初学者提供一个学习范本。 一、RMI(远程方法调用)的组成 一个正常工作的RMI系统由下面几个部分组成: 1、远程服务的接口定义 2、远程服务接口的具体实现 3、桩(Stub)和框架(Skeleton)文件 4、一个运行远程服务的服务器 5、一个RMI命名服务,它允许客户端去发现这个远程服务 6、类文件的提供

2、者(一个HTTP或者FTP服务器) 7、一个需要这个远程服务的客户端程序 二、RMI(远程方法调用)的工作原理 RMI系统结构,在客户端和服务器端都有几层结构。 - - | 客户 | | 服务器| - - | | - - | 占位程序 | | 骨干网 | - - | | - | 远 程 引 用 层 | - | | - | 传 输 层 | - 方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮

3、演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。 要完成以上步骤需要有以下几个步骤: 1、生成一个远程接口 2、实现远程对象(服务器端程序) 3、编写服务器程序 、注册远程对象、启动远程对象 4、编写客户程序   在JDK1.5之后,用java提供的API将会更加的

4、简单,可以参照下面的例子; 三、例子 1、远程接口 /* * 该接口定义了一个方法,用于提供远程服务; */ package com.liuxiang.rmi.download; import java.rmi.Remote; import java.rmi.RemoteException; /* * 远程对象接口 */ public interface IRMI extends Remote     public Object invoke(ITask task) throws RemoteException; 2、实现远程对象(服务器端程序) /* * 实现了

5、远程接口定义的方法;该实现远程对象中,调用了传入参数的task.doWork()方 * 法,同时执行一个本地调用,调用一个播放Mp3的代码段ProcessCaller.callMp3(); */ package com.liuxiang.rmi.download; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import com.liuxiang.callwindow.ProcessCaller; /* * 远程对象的实现 */ public class IRMIImpl extend

6、s UnicastRemoteObject implements IRMI     protected IRMIImpl() throws RemoteException         super();         private static final long serialVersionUID = 6131922116577454476L; public Object invoke(ITask task) throws Re

7、moteException         System.out.println("注意:这是一个远程调用");         Object obj = task.doWork();         System.out.println("调用ITask.doWork()方法的返回值:"+obj.toString();   &

8、#160;     /客户端调用,可以在服务器端播放需要的音乐         ProcessCaller.callMp3();         return obj;     3、播放Mp3代码段的源代码如下: package com.liuxiang.callwindow; /* * 在java中调用windows程序 */ public class ProcessCaller &#

9、160;   /*      * 调用Windows程序      * 利用Windows Media Player播放mp3音乐      */     public static void callMp3()         Runtime ru = Runtime.getRuntime();      

10、   try             / 调用播放器文件播放指定MP3             Process p1 = ru.exec("C:Program FilesWindows Media Playerwmplayer F:/music/lx/刘若英-后来.mp3");      

11、   catch (Exception e)                 public static void main(String args)         callMp3();     4、任务接口 /* * 该接口定义了远程方法需要传递的参数 */ package com.liuxiang.rmi.download; import j

12、ava.io.Serializable; /* * 任务接口 * */ public interface ITask extends Serializable     public Object doWork(); 5、任务接口实现 package com.liuxiang.rmi.download; /* * 任务实现类 * 该实现定义了远程方法需要传递的参数 * */ public class TaskImpl implements ITask     public Object doWork()   

13、0;     System.out.println("当前程序处于远程调用中");         return "动态上载对象的返回值"         6、编写服务器程序 、注册远程对象、启动远程对象 /* *远程对象的注册类.该类应该在服务器端执行 *执行之后,该机器将变为RMI服务器,客户端可以通过正确的url来访问; *服务器上的远程对象;执行对外报露的方法 */ packag

14、e com.liuxiang.rmi.download; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIServer     /*      * 如果没有创建一个Registry,Naming是不会帮助你创建的。 还是自己手工创建的比较的好      *     

15、 * 尽量用下面的自己封装的bind方法来注册远程对象      *      * throws Exception      */     public static void registRemoteObject() throws Exception         IRMIImpl impl = new IRMIImpl();    

16、0;    Naming.rebind("rmi:/7:1111/mytask", impl);         System.out.println("bound success!");         /*      * 创建一个Registry对象      *   &#

17、160;  * return 返回一个Registry对象      */     private static Registry createRegistry()         Registry registry = null;         int port = 1111;         try &

18、#160;           registry = LocateRegistry.getRegistry(port);             registry.list();             System.out.println("Register the

19、exist server!");         catch (final Exception e)             try                 registry = LocateRegistry.createRegistry(port);

20、                 System.out.println("Register the exist server!port=" + port);             catch (final Exception ee)        

21、         ee.printStackTrace();                             return registry;         /*    

22、  * 将对象注册到rmi服务器上      */     public static void bind()         Registry registry = null;         registry = createRegistry();         try   

23、0;         IRMIImpl impl = new IRMIImpl();             registry.rebind("mytask", impl);             System.out.println("mytask server s

24、tart!");         catch (Exception e)             e.printStackTrace();                 /*      * param args   &

25、#160;  */     public static void main(String args)         try             bind();         catch (Exception e)        &#

26、160;    e.printStackTrace();             /运行该服务端代码后,将会注册一个远程服务对象,通过恰当的URL可以访问远程对象 /中的方法;运行后的结果如下: /Register the exist server!port=1111 /mytask server start! 7、编写客户程序 /* * 代码首先获取一个远程对象,然后如同本地调用一样,调用远程对象中的方法。 */ package com.liuxiang.rmi.

27、download; import java.rmi.Naming; public class RMIClient     /*      * 调用远程对象中的方法      * throws Exception      */     public static void getRemoteObject() throws Exception         IRMI obj = (IRMI)Naming.lookup("rmi:/localhost:1111/mytask");    /得到远程发布的服务         TaskImpl task = new TaskImpl();  &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论