background image

 
开发客户机
  生成存根和基干,启动 RMI 注册表、服务器和客户机
  下面我们将通过开发一个文件传输程序来实践这些步骤。

 

  范例: 文件传输程序
  这个应用程序允许客户机从远程主机上传送(即下载)任何类型的文件(  

纯 文本或二进

制文件)

 

。第一步是定义一个远程接口,这个接口规定了服务器所提 供方法的信号,客户

机将调用这些方法。
  定义一个远程接口
  用于文件下载应用程序的远程接口如代码范例 1

 

所示。接口 FileInterface 提供了一

个方法 downloadFile

 

,这个 方法接受 String 参数(文件名),将文件的数据以字节数组

 

的形式 返回。
  代码范例 1 1: FileInterface.java
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  public interface FileInterface extends Remote {
  public byte[] downloadFile(String fileName) throws
  RemoteException;
  }

  请注意 FileInterface 的以下特征:
  它必须声明为 public

 

,这样客户机才能加载实现远程接口 的远程对象。

  它必须扩展为 Remote

 

接口,以满足使该对象成为远程对象的 要求。

  这个接口中的每种方法都必须投出一个 java.rmi.RemoteException。
  实现远程接口
  下一步是实现接口 FileInterface。实现的范例见代码范例 2  

。 请注意,除了实现

FileInterface 之外,还把 FileImpl 类扩展为 UnicastRemoteObject。这表示 FileImpl

 

类 将用于创建一个单独的、不可复制的远程对象,它使用 RMI 缺省的基于 TCP

 

的传送 通

道进行通讯。
  代码范例 2: FileImpl.java
  import java.io.*;
  import java.rmi.*;
  import java.rmi.server.UnicastRemoteObject;
  public class FileImpl extends UnicastRemoteObject
  implements FileInterface {
  private String name;
  public FileImpl(String s) throws RemoteException{
  super();
  name = s;
  }
  public byte[] downloadFile(String fileName){
  try {
  File file = new File(fileName);