﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-table-文章分类-EJB</title><link>http://www.blogjava.net/table/category/41235.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 12 Aug 2009 11:56:28 GMT</lastBuildDate><pubDate>Wed, 12 Aug 2009 11:56:28 GMT</pubDate><ttl>60</ttl><item><title>RMI实用教程</title><link>http://www.blogjava.net/table/articles/290697.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Tue, 11 Aug 2009 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/290697.html</guid><wfw:comment>http://www.blogjava.net/table/comments/290697.html</wfw:comment><comments>http://www.blogjava.net/table/articles/290697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/290697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/290697.html</trackback:ping><description><![CDATA[<p><font size="+0">Java Remote Method Invocation ( RMI -- Java远程方法调用)允许您使用Java编写分布式对象。本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中，以及与用Java 编写的组件的连接，同时给出了一个详细的例子，可以给初学者提供一个学习范本。　　 </font></p>
<p><font size="+0">一、RMI（远程方法调用）的组成</font></p>
<p><font size="+0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个正常工作的RMI系统由下面几个部分组成： </font></p>
<p><font size="+0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、远程服务的接口定义 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、远程服务接口的具体实现 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、桩（Stub）和框架（Skeleton）文件 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、一个运行远程服务的服务器 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、一个RMI命名服务，它允许客户端去发现这个远程服务 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、类文件的提供者（一个HTTP或者FTP服务器） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、一个需要这个远程服务的客户端程序 </font></p>
<font size="+0">
<p><br />
二、RMI（远程方法调用）的工作原理 </p>
<p>RMI系统结构，在客户端和服务器端都有几层结构。 <br />
--------- ---------- <br />
| 客户 | | 服务器| <br />
---------- ---------- <br />
| | <br />
------------- ---------- <br />
| 占位程序 | | 骨干网 | <br />
-------------- ----------- <br />
| | <br />
------------------------------------ <br />
| 远 程 引 用 层 | <br />
------------------------------------ <br />
| | <br />
------------------------------------ <br />
| 传 输 层 | <br />
------------------------------------ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 方法调用从客户对象经占位程序（Stub)、远程引用层(Remote Reference Layer)和传输层（Transport Layer）向下，传递给主机，然后再次经传 输层，向上穿过远程调用层和骨干网（Skeleton），到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色，使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信，决定调用是应发往一个服务器还是多个。传输层管理实际的连接，并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用，并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端，再向上经传输层和远程调用层返回。最后，占位程序获得返回值。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要完成以上步骤需要有以下几个步骤： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、生成一个远程接口 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、实现远程对象(服务器端程序) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、编写服务器程序 、注册远程对象、启动远程对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、编写客户程序 <br />
在JDK1.5之后，用java提供的API将会更加的简单，可以参照下面的例子；</p>
<p>三、例子</p>
<p>1、远程接口</p>
<p>接口名：com.liuxiang.rmi.download.IRMI</p>
<p>该接口定义了一个方法，用于提供远程服务；</p>
<p>&nbsp;</p>
<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.liuxiang.rmi.download;</p>
<p>import java.rmi.Remote;<br />
import java.rmi.RemoteException;</p>
<p>/**<br />
&nbsp;* 远程对象接口<br />
&nbsp;* @author liuxiang<br />
&nbsp;* 2007-8-30 下午09:39:15&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*/<br />
public interface IRMI extends Remote{<br />
&nbsp;&nbsp;&nbsp; public Object invoke(ITask task) throws RemoteException;<br />
}</p>
<p>2、实现远程对象(服务器端程序)</p>
<p>类名：com.liuxiang.rmi.download.IRMIImpl</p>
<p>实现了远程接口定义的方法；该实现远程对象中，调用了传入参数的task.doWork()方法，同时执行一个本地调用，调用一个播放Mp3的代码段ProcessCaller.callMp3();</p>
<p><br />
&nbsp;</p>
<p><font size="+0">/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.liuxiang.rmi.download;</font></p>
<p><font size="+0">import java.rmi.RemoteException;<br />
import java.rmi.server.UnicastRemoteObject;</font></p>
<p><font size="+0">import com.liuxiang.callwindow.ProcessCaller;</font></p>
<p><font size="+0">/**<br />
&nbsp;* 远程对象的实现<br />
&nbsp;* @author liuxiang<br />
&nbsp;* 2007-8-30 下午09:41:32&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*/<br />
public class IRMIImpl extends UnicastRemoteObject implements IRMI {</font></p>
<p><font size="+0">&nbsp;&nbsp;&nbsp; protected IRMIImpl() throws RemoteException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="+0">&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = 6131922116577454476L;</font></p>
<p><font size="+0">&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see com.liuxiang.rmi.download.IRMI#invoke(com.liuxiang.rmi.download.ITask)<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object invoke(ITask task) throws RemoteException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("注意：这是一个远程调用");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj = task.doWork();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("调用ITask.doWork()方法的返回值："+obj.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //客户端调用，可以在服务器端播放需要的音乐<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessCaller.callMp3();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="+0">}</font></p>
<font size="+0">
<p><br />
3、播放Mp3代码段的源代码如下：</p>
<p>&nbsp;</p>
<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.liuxiang.callwindow;</p>
<p>/**<br />
&nbsp;* 在java中调用windows程序<br />
&nbsp;* @author liuxiang 2007-8-30 下午10:26:20<br />
&nbsp;* <br />
&nbsp;*/<br />
public class ProcessCaller {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 调用Windows程序<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 利用Windows Media Player播放mp3音乐<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void callMp3() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runtime ru = Runtime.getRuntime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 调用播放器文件播放指定MP3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process p1 = ru<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .exec("C:\Program Files\Windows Media Player\wmplayer F:/music/lx/刘若英-后来.mp3");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callMp3();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>4、任务接口</p>
<p>该接口定义了远程方法需要传递的参数</p>
<p><br />
&nbsp;</p>
<p><font size="+0">/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.liuxiang.rmi.download;</font></p>
<p><font size="+0">import java.io.Serializable;</font></p>
<p><font size="+0">/**<br />
&nbsp;* 任务接口<br />
&nbsp;* @author liuxiang<br />
&nbsp;* 2007-8-30 下午09:35:53&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*/<br />
public interface ITask extends Serializable{<br />
&nbsp;&nbsp;&nbsp; public Object doWork();<br />
}</font></p>
<font size="+0">
<p><br />
5、任务接口实现</p>
<p>该实现定义了远程方法需要传递的参数</p>
<p>&nbsp;</p>
<p>package com.liuxiang.rmi.download;</p>
<p>/**<br />
&nbsp;* 任务实现类<br />
&nbsp;* @author liuxiang<br />
&nbsp;* 2007-8-31 上午09:08:57&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*/<br />
public class TaskImpl implements ITask{</p>
<p>&nbsp;&nbsp;&nbsp; public Object doWork() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("当前程序处于远程调用中");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "动态上载对象的返回值";<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
}</p>
<p>6、编写服务器程序 、注册远程对象、启动远程对象</p>
<p>代码：远程对象的注册类 该类应该在服务器端执行 执行之后， 该机器将变为RMI服务器 客户端可以通过正确的url来访问；服务器上的远程对象；执行对外报露的方法</p>
<p>&nbsp;</p>
<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.liuxiang.rmi.download;</p>
<p>import java.rmi.Naming;<br />
import java.rmi.registry.LocateRegistry;<br />
import java.rmi.registry.Registry;</p>
<p>/**<br />
&nbsp;* 远程对象的注册类 该类应该在服务器端执行 执行之后，<br />
&nbsp;* 该机器将变为RMI服务器 客户端可以通过正确的url来访问<br />
&nbsp;* 服务器上的远程对象；执行对外报露的方法<br />
&nbsp;* <br />
&nbsp;* @author liuxiang 2007-8-30 下午09:44:54<br />
&nbsp;* <br />
&nbsp;*/<br />
public class RMIServer {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 如果没有创建一个Registry，Naming是不会帮助你创建的。 还是自己手工创建的比较的好<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * 尽量用下面的自己封装的bind方法来注册远程对象<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void registRemoteObject() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IRMIImpl impl = new IRMIImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Naming.rebind("rmi://219.233.8.97:1111/mytask", impl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("bound success!");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 创建一个Registry对象<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 返回一个Registry对象<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private static Registry createRegistry() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Registry registry = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int port = 1111;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registry = LocateRegistry.getRegistry(port);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registry.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Register the exist server!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (final Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registry = LocateRegistry.createRegistry(port);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Register the exist server!port=" + port);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (final Exception ee) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ee.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return registry;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 将对象注册到rmi服务器上<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void bind() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Registry registry = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registry = createRegistry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IRMIImpl impl = new IRMIImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registry.rebind("mytask", impl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("mytask server start!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bind();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>运行该服务端代码后，将会注册一个远程服务对象，通过恰当的URL可以访问远程对象中的方法；运行后的结果如下：</p>
<p><font size="+0">Register the exist server!port=1111<br />
mytask server start! </font></p>
<p><font size="+0">7、编写客户程序</font></p>
<p><font size="+0">代码首先获取一个远程对象，然后如同本地调用一样，调用远程对象中的方法。</font></p>
<p><font size="+0"></font>&nbsp;</p>
<p><font size="+0">/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.liuxiang.rmi.download;</font></p>
<p><font size="+0">import java.rmi.Naming;</font></p>
<p><font size="+0">/**<br />
&nbsp;* @author liuxiang<br />
&nbsp;* 2007-8-30 下午09:47:41&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*/<br />
public class RMIClient {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 调用远程对象中的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void getRemoteObject() throws Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IRMI obj = (IRMI)Naming.lookup("rmi://localhost:1111/mytask");&nbsp;&nbsp;&nbsp; //得到远程发布的服务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TaskImpl task = new TaskImpl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result = obj.invoke(task);&nbsp;&nbsp;&nbsp; //调用远程服务的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(result.toString());<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="+0">&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getRemoteObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="+0">}</font></p>
<p><font size="+0">最后，运行客户端代码，可以看到控制台分别输出了如下的内容：</font></p>
<p><font size="+0">Server端输出了更多的内容，如下：</font></p>
<p><font size="+0"></font>&nbsp;</p>
<p><font size="+0">Register the exist server!port=1111<br />
mytask server start!<br />
注意：这是一个远程调用<br />
当前程序处于远程调用中<br />
调用ITask.doWork()方法的返回值：动态上载对象的返回值 <br />
同时可以看到，会调用了Windows的Mediaplay播放本地磁盘的Mp3歌曲；</font></p>
<p><font size="+0">Client端输入了如下内容：</font></p>
<p><font size="+0"></font>&nbsp;</p>
<p><font size="+0">动态上载对象的返回值<br />
&nbsp;<br />
四、RMI介绍</font></p>
<p><font size="+0">RMI（Remote Method Invocation，远程方法调用）是用Java在JDK1.1中实现的，它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言，其巨大的威力就体现在它强大的开发分布式网络应用的能力上，而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信，实现远程对象之间的无缝远程调用。&nbsp; </font></p>
<p><font size="+0">RMI目前使用Java远程消息交换协议JRMP（Java Remote Messaging Protocol）进行通信。JRMP是专为Java的远程对象制定的协议。因此，Java RMI具有Java的"Write Once,Run Anywhere"的优点，是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE（Java Run Environment Java，运行环境）的平台上。但由于JRMP是专为Java对象制定的，因此，RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。 </font></p>
<p><font size="+0">RMI为采用Java对象的分布式计算提供了简单而直接的途径。这些对象可以是新的Java对象，也可以是围绕现有API的简单的Java包装程序。Java体现了&#8220;编写一次就能在任何地方运行的模式。而RMI可将Java模式进行扩展，使之可在任何地方运行&#8221;。 </font></p>
<p><font size="+0">　　因为RMI是以Java为核心的，所以，它将Java的安全性和可移植性等强大功能带给了分布式计算。您可将代理和梢?务逻辑等属性移动到网络中最合适的地方。如果您要扩展Java在系统中的使用，RMI将使您充分利用其强大功能。 </font></p>
<p><font size="+0">　　RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接。RMI/JNI和RMI/JDBC相结合，可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信，而且在您需要时可扩展Java在这些服务器上的使用。RMI可帮助您在扩展使用时充分利用Java的强大功能。</font></p>
<p><font size="+0"></font>&nbsp;</p>
</font></font></font>
<img src ="http://www.blogjava.net/table/aggbug/290697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-08-11 17:50 <a href="http://www.blogjava.net/table/articles/290697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RMI基础教程</title><link>http://www.blogjava.net/table/articles/290695.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Tue, 11 Aug 2009 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/290695.html</guid><wfw:comment>http://www.blogjava.net/table/comments/290695.html</wfw:comment><comments>http://www.blogjava.net/table/articles/290695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/290695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/290695.html</trackback:ping><description><![CDATA[RMI，远程方法调用（Remote&nbsp;Method&nbsp;Invocation）是Enterprise&nbsp;JavaBeans的支柱，是建立分布式Java应用程序的方便途径。RMI是非常容易使用的，但是它非常的强大。<br />
　　RMI的基础是接口，RMI构架基于一个重要的原理：定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子，建立一个简单的远程计算服务和使用它的客户程序<br />
一个正常工作的RMI系统由下面几个部分组成：&nbsp;<br />
<li>远程服务的接口定义
<li>远程服务接口的具体实现
<li>Stub&nbsp;和&nbsp;Skeleton&nbsp;文件
<li>一个运行远程服务的服务器
<li>一个RMI命名服务，它允许客户端去发现这个远程服务
<li>类文件的提供者（一个HTTP或者FTP服务器）
<li>一个需要这个远程服务的客户端程序
<li><br />
　　下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹，以便放置我们创建的文件，为了简单起见，我们只使用一个文件夹存放客户端和服务端代码，并且在同一个目录下运行服务端和客户端。<br />
　　如果所有的RMI文件都已经设计好了，那么你需要下面的几个步骤去生成你的系统：<br />
　　1、&nbsp;&nbsp;编写并且编译接口的Java代码<br />
　　2、&nbsp;&nbsp;编写并且编译接口实现的Java代码<br />
　　3、&nbsp;&nbsp;从接口实现类中生成&nbsp;Stub&nbsp;和&nbsp;Skeleton&nbsp;类文件<br />
　　4、&nbsp;&nbsp;编写远程服务的主运行程序<br />
　　5、&nbsp;&nbsp;编写RMI的客户端程序<br />
　　6、&nbsp;&nbsp;安装并且运行RMI系统<br />
<br />
我的程序是在NetBeans IDE 5.5和JDK1.6下编写的，当然运行是在命令提示符下进行的
<p><br />
1、接口<br />
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能，在这里我们所有完成的就是加减乘除，下面是源程序：<br />
</p>
<ol>
    <li><font color="#339900"><font color="#000000">package rmiDemo;</font></font>
    <li><font color="#339900"><em>//Calculator.java</em></font>
    <li><em><font color="#339900">//define&nbsp;the&nbsp;interface</font></em>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>Remote</u></font></strong>;
    <li>
    <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">interface</font></strong>&nbsp;Calculator&nbsp;<strong><font color="#0000ff">extends</font></strong>&nbsp;<strong><font class="classLink" color="#0000ff"><u>Remote</u></font></strong>
    <li>{
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;add(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>;&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;sub(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>;&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;mul(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>;&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;div(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>;&nbsp;
    <li>}&nbsp; </li>
</ol>
<p>注意：这个接口继承自Remote，每一个定义的方法都必须抛出一个RemoteException异常对象。<br />
建立这个文件，把它存放在刚才的目录下，并且编译。<br />
<br />
<strong>2、接口的具体实现<br />
<br />
</strong>　　下一步，我们就要写远程服务的具体实现，这是一个CalculatorImpl类文件：<br />
</p>
<ol>
    <li><font color="#339900"><font color="#000000">package rmiDemo; </font></font>
    <li><font color="#339900"><em>//CalculatorImpl.java</em></font>
    <li><em><font color="#339900">//Implementation</font></em>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.rmi.server.<strong><font class="classLink" color="#0000ff"><u>UnicastRemoteObject</u></font></strong>;
    <li>
    <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">class</font></strong>&nbsp;CalculatorImpl&nbsp;<strong><font color="#0000ff">extends</font></strong>&nbsp;<strong><font class="classLink" color="#0000ff"><u>UnicastRemoteObject</u></font></strong>&nbsp;<strong><font color="#0000ff">implements</font></strong>&nbsp;Calculator&nbsp;
    <li>{&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><font color="#339900">//&nbsp;这个实现必须有一个显式的构造函数，并且要抛出一个RemoteException异常&nbsp;</font></em>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;CalculatorImpl()&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">super</font></strong>();&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;add(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;a&nbsp;+&nbsp;b;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;sub(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;a&nbsp;-&nbsp;b;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;mul(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;a&nbsp;*&nbsp;b;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;div(<strong><font color="#0000ff">long</font></strong>&nbsp;a,&nbsp;<strong><font color="#0000ff">long</font></strong>&nbsp;b)&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;a&nbsp;/&nbsp;b;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>}&nbsp; </li>
</ol>
<p>　　这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中，我们是直接的从UnicastRemoteObject这个类上继承的，事实上并不一定要这样做，如果一个类不是从UnicastRmeoteObject上继承，那必须使用它的exportObject()方法去联接到RMI。<br />
　　如果一个类继承自UnicastRemoteObject，那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super()，它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。<br />
<strong>3、Stubs&nbsp;和Skeletons<br />
<br />
</strong>　　下一步就是要使用RMI编译器rmic来生成桩和框架文件，这个编译运行在远程服务实现类文件上。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在IDE中build所有程序<br />
　　&gt;rmic&nbsp;rmiDemoCalculatorImpl<br />
<br />
　　在你的目录下运行上面的命令，成功执行完上面的命令你可以发现一个Calculator_stub.class文件，如果你是使用的Java2SDK，那么你还可以发现Calculator_Skel.class文件。<br />
<br />
　　<strong>4、主机服务器</strong><br />
<br />
　　远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。<br />
<br />
</p>
<div class="codeStyle">
<ol>
    <li><font color="#339900"><font color="#000000">package rmiDemo;</font></font>
    <li><font color="#339900"><em>//CalculatorServer.java</em></font>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>Naming</u></font></strong>;
    <li>
    <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">class</font></strong>&nbsp;CalculatorServer&nbsp;{
    <li>
    <li>&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;CalculatorServer()&nbsp;{
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">try</font></strong>&nbsp;{
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calculator&nbsp;c&nbsp;=&nbsp;<strong><font color="#0000ff">new</font></strong>&nbsp;CalculatorImpl();
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>Naming</u></font></strong>.rebind(<font color="#ff33ff">"rmi://localhost:1099/CalculatorService"</font>,&nbsp;c);
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<strong><font color="#0000ff">catch</font></strong>&nbsp;(<strong><font class="classLink" color="#0000ff"><u>Exception</u></font></strong>&nbsp;e)&nbsp;{
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(<font color="#ff33ff">"Trouble:&nbsp;"</font>&nbsp;+&nbsp;e);
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    <li>&nbsp;&nbsp;&nbsp;}
    <li>
    <li>&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">static</font></strong>&nbsp;<strong><font color="#0000ff">void</font></strong>&nbsp;main(<strong><font class="classLink" color="#0000ff"><u>String</u></font></strong>&nbsp;args[])&nbsp;{
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">new</font></strong>&nbsp;CalculatorServer();
    <li>&nbsp;&nbsp;&nbsp;}
    <li>} </li>
</ol>
</div>
<p>　　<strong>5、客户端</strong><br />
<br />
　　客户端源代码如下：<br />
</p>
<div class="codeStyle">
<ol>
    <li>package rmiDemo;
    <li><em><font color="#339900">//CalculatorClient.java</font></em>
    <li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>Naming</u></font></strong>;&nbsp;
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>;&nbsp;
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.net.<strong><font class="classLink" color="#0000ff"><u>MalformedURLException</u></font></strong>;&nbsp;
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.rmi.<strong><font class="classLink" color="#0000ff"><u>NotBoundException</u></font></strong>;&nbsp;
    <li>
    <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">class</font></strong>&nbsp;CalculatorClient&nbsp;{&nbsp;
    <li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">static</font></strong>&nbsp;<strong><font color="#0000ff">void</font></strong>&nbsp;main(<strong><font class="classLink" color="#0000ff"><u>String</u></font></strong>[]&nbsp;args)&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">try</font></strong>&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calculator&nbsp;c&nbsp;=&nbsp;(Calculator)
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>Naming</u></font></strong>.lookup(
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">"rmi://localhost</font>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/CalculatorService<font color="#ff33ff">");&nbsp;</font>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(&nbsp;c.sub(4,&nbsp;3)&nbsp;);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(&nbsp;c.add(4,&nbsp;5)&nbsp;);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(&nbsp;c.mul(3,&nbsp;6)&nbsp;);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(&nbsp;c.div(9,&nbsp;3)&nbsp;);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">catch</font></strong>&nbsp;(<strong><font class="classLink" color="#0000ff"><u>MalformedURLException</u></font></strong>&nbsp;murle)&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println();&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">"MalformedURLException"</font>);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(murle);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">catch</font></strong>&nbsp;(<strong><font class="classLink" color="#0000ff"><u>RemoteException</u></font></strong>&nbsp;re)&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println();&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">"RemoteException"</font>);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(re);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">catch</font></strong>&nbsp;(<strong><font class="classLink" color="#0000ff"><u>NotBoundException</u></font></strong>&nbsp;nbe)&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println();&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">"NotBoundException"</font>);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(nbe);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">catch</font></strong>&nbsp;(
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.lang.<strong><font class="classLink" color="#0000ff"><u>ArithmeticException</u></font></strong>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ae)&nbsp;{&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println();&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">"java.lang.ArithmeticException"</font>);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font class="classLink" color="#0000ff"><u>System</u></font></strong>.out.println(ae);&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
    <li>}&nbsp; </li>
</ol>
</div>
<p>　　保存这个客户端程序到你的目录下（注意这个目录是一开始建立那个，所有的我们的文件都在那个目录下）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在IDE中build所有程序。<br />
　　<strong>6、运行RMI系统</strong><br />
<br />
　　现在我们建立了所有运行这个简单RMI系统所需的文件，现在我们终于可以运行这个RMI系统啦！来享受吧。<br />
<br />
　　我们是在命令控制台下运行这个系统的，你必须开启三个控制台窗口，一个运行服务器，一个运行客户端，还有一个运行RMIRegistry。<br />
<br />
　　首先运行注册程序RMIRegistry，你必须在包含你刚写的类的那么目录下运行这个注册程序。<br />
<br />
　　&gt;rmiregistry<br />
<br />
　　好，这个命令成功的话，注册程序已经开始运行了，不要管他，现在切换到另外一个控制台，在第二个控制台里，我们运行服务器CalculatorService，因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子&nbsp;<br />
grant&nbsp;{<br />
permission&nbsp;java.security.AllPermission&nbsp;"",&nbsp;"";<br />
};<br />
<br />
　　注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。<br />
<br />
　　现在为了运行服务端，你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。<br />
<br />
　　&gt;&nbsp;java&nbsp;-Djava.security.policy=C:\Documents and Settings\Administrator\RMI\build\classes\ &nbsp;rmiDemo.CalculatorServer<br />
<br />
　　这个服务器就开始工作了，把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台，启动我们的客户端。<br />
<br />
　　为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class)&nbsp;和一个stub(CalculatorImpl_Stub.class)。&nbsp;使用如下命令运行客户端<br />
<br />
　　&nbsp;&gt;&nbsp;java&nbsp;-Djava.security.policy=C:\Documents and Settings\Administrator\RMI\build\classes\ rmiDemo.&nbsp;CalculatorClient<br />
<br />
　　如果所有的这些都成功运行，你应该看到下面的输出：<br />
　　1<br />
　　9<br />
　　18<br />
　　3<br />
</p>
</li>
<img src ="http://www.blogjava.net/table/aggbug/290695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-08-11 17:44 <a href="http://www.blogjava.net/table/articles/290695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>