⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3.html

📁 写给JSP初级程序员的书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
远程方法在其 throws 子句中必须指定 java.rmi.RemoteException(或它的 
超类,例如 java.io.IOException 或 java.lang.Exception)。 

当远程方法调用由于某种原因失败时,将抛出 java.rmi.RemoteException 异 
常。远程方法调用失败的原因包括: 

通讯失败(远程服务器不可达或拒绝连接;连接被服务器关闭等。) 
参数或返回值传输或读取时失败 
协议错误 
RemoteException 类是一个已检验的异常(必须由远程方法的调用程序处理并 
经编译器检验的异常),而不是 RuntimeException。 

2.4.3 RemoteObject 类及其子类 
RMI 服务器函数由 java.rmi.server.RemoteObject 及其子类 
java.rmi.server.RemoteServer、java.rmi.server.UnicastRemoteObject 
和 java.rmi.activation.Activatable 提供。 

java.rmi.server.RemoteObject 为对远程对象敏感的 java.lang.Object 
方法、hashCode、 equals 和 toString 提供实现。 
创建远程对象并将其导出(使它们可为远程客户机利用)所需的方法由类 
UnicastRemoteObject 和 Activatable 提供。子类可以识别远程引用的语义, 

例如服务器是简单的远程对象还是可激活的远程对象(调用时将执行的远程对象)。 
java.rmi.server.UnicastRemoteObject 类定义了单体(单路传送)远程对 
象,其引用只有在服务器进程活着时才有效。 
类 java.rmi.activation.Activatable 是抽象类,它定义的 activatable 
远程对象在其远程方法被调用时开始执行并在必要时自己关闭。 

2.5 实现远程接口 
实现远程接口的类的一般规则如下: 

该类通常扩展 java.rmi.server.UnicastRemoteObject,因而将继承类 
java.rmi.server.RemoteObject 和java.rmi.server.RemoteServer 提供 
的远程行为。 
该类能实现任意多的远程接口。 
该类能扩展其它远程实现类。 
该类能定义远程接口中不出现的方法,但这些方法只能在本地使用而不能在远程 

使用。 
例如,下面的类 BankAcctImpl 实现 BankAccount 远程接口并扩展 
java.rmi.server.UnicastRemoteObject 类: 

package mypackage; 

import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class BankAccountImpl extends UnicastRemoteObject implements 
BankAccount 

{ 
private float balance = 0.0; 

public BankAccountImpl(float initialBalance) 
throws RemoteException 
{ 
balance = initialBalance; 
} 

public void deposit(float amount) throws RemoteException 
{ 
... 
} 

public void withdraw(float amount) throws OverdrawnException, 
RemoteException 
{ 
... 
} 

public float getBalance() throws RemoteException 
{ 
... 
} 
} 


注意:必要时,实现远程接口的类能扩展除 
java.rmi.server.UnicastRemoteObject 类以外的其它一些类。但实现类此 
时必须承担起一定的责任,即导出对象(由 UnicastRemoteObject 构造函数 
负责)和实现从 java.lang.Object 类继承的 hashCode、 equals 和 
toString 方法的正确远程语义(如果需要)。 


2.6 远程方法调用中的参数传递 
传给远程对象的参数或源于它的返回值可以是任意可序列化的 Java 对象。这包 

括 Java 基本类型, 远程?Java 对象和实现 java.io.Serializable 接口的 
非远程 Java 对象。有关如何使类序列化的详细信息,参见 Java“对象序列化 

规范”。本地得不到的作为参数或返回值的类,可通过 RMI 系统进行动态下载。 

有关 RMI 读取参数、返回值和异常时如何下载参数和返回值类的详细信息,参 

见“动态类加载”(3.4)一节。 

2.6.1 传递非远程对象 
非远程对象将作为远程方法调用的参数传递或作为远程方法调用的结果返回时, 
是通过复制传递的;也就是使用 Java 对象序列化机制将该对象序列化。 
因此,在远程对象调用过程中,当非远程对象作为参数或返回值传递时,非远程 
对象的内容在调用远程对象之前将被复制。 
从远程方法调用返回非远程对象时,将在调用的虚拟机中创建新对象。 

2.6.2 传递远程对象 
当将远程对象作为远程方法调用的参数或返回值传递时,远程对象的 stub 程序 
即被传递出去。作为参数传递的远程对象仅能实现远程接口。 

2.6.3 引用的完整性 
如果一个对象的两个引用在单个远程方法调用中以参数形式(或返回值形式)从 
一个虚拟机传到另一个虚拟机中,并且它们在发送虚拟机中指向同一对象,则两 
个引用在接收虚拟机中将指向该对象的同一副本。进一步说就是:在单个远程方 
法调用中,RMI 系统将在作为调用参数或返回值传递的对象中保持引用的完整性 

2.6.4 类注解 
当对象在远程调用中被从一个虚拟机发送到另一个虚拟机中时,RMI 系统在调用 
流中用类的信息 (URL) 给类描述符加注解,以便该类能在接收器上加载。在远 
程方法调用期间,调用可随时下载类。 

2.6.5 参数传输 
为将 RMI 调用的参数序列化到远程调用的目的文件里,需要将该参数写入作为 
java.io.ObjectOutputStream 类的子类的流中。ObjectOutputStream 子类 
将覆盖 replaceObject 方法,目的是用其相应的 stub 类取代每个远程对象。 
对象参数将通过 ObjectOutputStream 的 writeObject 方法写入流中。而 
ObjectOutputStream 则通过 writeObject 方法为每个写入流中的对象(包 
含所写对象所引用的对象)调用 replaceObject 方法。RMIObjectOutputStream 
子类的 replaceObject 方法返回下列值: 
如果传给 replaceObject 的对象是 java.rmi.Remote 的实例,则返回远程对 
象的 stub 程序。远程对象的 stub 程序通过对 
java.rmi.server.RemoteObject.toStub 
方法的调用而获得。 
如果传给 replaceObject 的对象不是 java.rmi.Remote 的实例,则只返回 
该对象。 
RMI 的 ObjectOutputStream 子类也实现 annotateClass 方法,该方法用类 
的位置注解调用流以便能在接收器中下载该类。有关如何使用 annotateClass 
的详细信息,参见“动态类加载”一节。 
因为参数只写入一个 ObjectOutputStream,所以指向调用程序同一对象的引用 
将在接收器那里指向该对象的同一副本。在接收器上,参数将被单个 
ObjectInputStream 所读取。 

用于写对象的 ObjectOutputStream(类似的还有用于读对象的 
ObjectInputStream )的所有其它缺省行为将保留在参数传递中。例如,写对 
象时对 writeReplace 的调用及读对象时对 readResolve 的调用就是由 RMI 
的参数编组与解编流完成的。 

与上述 RMI 参数传递方式类似,返回值(或异常)将被写入 
ObjectOutputStream 
的子类并和参数传输的替代行为相同。 


2.7 定位远程对象 
我们专门提供了一种简单的引导名字服务器,用于存储对远程对象的已命名引用 
。使用类 java.rmi.Naming 的基于 URL 的方法可以存储远程对象引用。 
客户机要调用远程对象的方法,则必须首先得到该对象的引用。对远程对象的引 
用通常是在方法调用中以返回值的形式取得。RMI 系统提供一种简单的引导名字 
服务器,通过它得到给定主机上的远程对象。java.rmi.Naming 类提供基于统 
一资源定位符 (URL) 的方法,用来绑定、再绑定、解开和列出位于某一主机及 
端口上的名字-对象对。 
</pre>
<p align=right>第一章缺  <a href="4.html" tppabs="http://www.chinajavaworld.com/doc/rmi_iiop/4.html"></a></p>
        </td>
      </tr>
      
    </td>
  </tr>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -