﻿<?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-深海有约-随笔分类-EJB</title><link>http://www.blogjava.net/shaolijun/category/22972.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 02 Jun 2007 10:45:51 GMT</lastBuildDate><pubDate>Sat, 02 Jun 2007 10:45:51 GMT</pubDate><ttl>60</ttl><item><title>RMI基础教程</title><link>http://www.blogjava.net/shaolijun/archive/2007/05/22/119213.html</link><dc:creator>CHUANDAOJUN</dc:creator><author>CHUANDAOJUN</author><pubDate>Tue, 22 May 2007 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/shaolijun/archive/2007/05/22/119213.html</guid><wfw:comment>http://www.blogjava.net/shaolijun/comments/119213.html</wfw:comment><comments>http://www.blogjava.net/shaolijun/archive/2007/05/22/119213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaolijun/comments/commentRss/119213.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaolijun/services/trackbacks/119213.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><br>　　</p>
</li>
<img src ="http://www.blogjava.net/shaolijun/aggbug/119213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shaolijun/" target="_blank">CHUANDAOJUN</a> 2007-05-22 20:08 <a href="http://www.blogjava.net/shaolijun/archive/2007/05/22/119213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>