`
bfcat
  • 浏览: 8373 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

用RMI和CORBA开发JAVA分布式程序

阅读更多
用RMI和CORBA开发JAVA分布式程序
阅读次数: 2075次 发布时间: 2003-08-22 00:00:00发布人: CN-JAVA翻译: lastsky




来源:


RMI(远程方法调用)和CORBA(通用对象调用代理架构)是两个最重要,并广泛应用的分布对象系统架构。每个架构都有优劣,这两个架构应用到从电子商务到医保系统等不同的领域。
两者中任何一个被应用到项目中都不是很容易的工作。这篇文章大概介绍了RMI和CORBA,并演示了如何开发一个远程下载文件的实例。

。介绍分布式对象系统

。介绍RMI和CORBA

。介绍一个RMI和CORBA的应用

。演示如何用RMI和CORBA从远程主机传输文件

。比较CORBA和RMI



C/S模式


客户机/服务器模式是服务器和客户机交换信息进行分布计算的一种模式。在这个模式里,客户机和服务器都用同一种语言—它们都理解的协议进行通信。
C/S模式有不同的开发方式,典型的应用是低层SOCKET开发。用SOCKET开发意味着我们必须设计一套协议,C/S双方能相互通信的一系列命令集。一个例子就是HTTP协议,提供了一个GET方法,为了得到传输的文档,C/S都必须实现。


分布式模式


基于系统的分布式对象是通过定义好的接口来隔离客户端请求和服务器端服务的对象集。

数据请求和执行是分开的,这是C/S模式与分布式模式的主要区别。


在一个分布式模型里,客户端发送消息给一个对象,这个对象判断消息决定哪种服务执行。

服务或者方法,SELECTION被对象或者代理来执行。RMI和CORBA就是这个模型的例子。



RMI
RMI是能使你很容易地开发分布市对象的系统。RMI比SOCKETS开发容易地多,不需要定义协议。用RMI,开发者会认为调用本地类的本地方法,实际上是从远程传输,翻译,并把结果传递到本地。



RMI应用起步
开发RMI,包括以下几个步骤:

1 定义一个远程接口

2 应用远程接口

3 服务器端开发

4 客户端开发

5 生成骨干代码,启动RMI注册,服务器,客户端



下面我们讲述每一步的具体实现。



例子:文件传输应用



允许传输任何类型的文件到远程主机。第一步定义描述方法的远程接口。

定义远程接口

代码一是下载文件的远程接口。接口FileInterface 提供了一个下载文件的方法,返回文件的字节集。

Code Sample 1: FileInterface.java

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface FileInterface extends Remote {
   public byte[] downloadFile(String fileName) throws
   RemoteException;
}




注意:

为了客户端能装载包含远程接口的远程对象,接口必须定义为Public

必须扩展Remote接口,为了实现远程对象

接口里的每个方法必须抛出RemoteException异常



应用远程接口
下一步是实现接口FileInterface,一个简单的应用在代码二。

注意为了实现接口FileInterface,类FileImpl必须扩展UnicastRemoteObject。

这说明类FileImpl创建一个单一,不能复制的通过TCP传输的RMI对象,

Code Sample 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);
         byte buffer[] = new byte[(int)file.length()];
         BufferedInputStream input = new
      BufferedInputStream(new FileInputStream(fileName));
         input.read(buffer,0,buffer.length);
         input.close();
         return(buffer);
      } catch(Exception e){
         System.out.println("FileImpl: "+e.getMessage());
         e.printStackTrace();
         return(null);
      }
   }
}


服务器端开发


第三步是开发服务器端,有三个步骤:

1 创建RMISecurityManager实例并安装它

2 创建一个远程对象的实例

3 用RMI注册对象。



Code Sample 3: FileServer.java

import java.io.*;
import java.rmi.*;

public class FileServer {
   public static void main(String argv[]) {
      if(System.getSecurityManager() == null) {
         System.setSecurityManager(new RMISecurityManager());
      }
      try {
         FileInterface fi = new FileImpl("FileServer");
         Naming.rebind("//127.0.0.1/FileServer", fi);
      } catch(Exception e) {
         System.out.println("FileServer: "+e.getMessage());
         e.printStackTrace();
      }
   }
}


这句 Naming.rebind("//127.0.0.1/FileServer", fi) 说明RMI 注册是运行在缺省端口1099。如果RMI注册是在其它端口,此句应改为: Naming.rebind("//127.0.0.1:4500/FileServer", fi)

客户端开发
下一步就是开发客户端。客户端远程调用远程接口定义的任何方法。为了实现,客户端必须先获得RMI注册的远程对象的实例。一旦获得,下载文件方法就别调用。如代码4。这个应用中,客户端接收两个命令行参数。

Code Sample 4: FileClient.java

import java.io.*;
import java.rmi.*;

public class FileClient{
   public static void main(String argv[]) {
      if(argv.length != 2) {
        System.out.println("Usage: java FileClient fileName machineName");
        System.exit(0);
      }
      try {
         String name = "//" + argv[1] + "/FileServer";
         FileInterface fi = (FileInterface) Naming.lookup(name);
         byte[] filedata = fi.downloadFile(argv[0]);
         File file = new File(argv[0]);
         BufferedOutputStream output = new
           BufferedOutputStream(new FileOutputStream(file.getName()));
         output.write(filedata,0,filedata.length);
         output.flush();
         output.close();
      } catch(Exception e) {
         System.err.println("FileServer exception: "+ e.getMessage());
         e.printStackTrace();
      }
   }
}


运行这个应用



为了运行这个应用,我们必须先生成骨干码,然后编译服务器端,客户端代码,RMI注册,最后开始应用。

为了生成骨干码,我们用RMIC命令:

命令行: rmic FileImpl

将生成两个文件: FileImpl_Stub.class 和 FileImpl_Skel.class. 客户端代理和服务端骨干。

下一步,编译SERVER,CLIENT代码

最后,开始RMI注册,运行。



命令行> rmiregistry portNumber



注册完成后,就可以开始服务器端应用。如果应用了RMI安全管理,你需要一个安全策略来处理。下面就是一个简单的security policy:

grant {
   permission java.security.AllPermission "", "";
};


注意:这只是一个简单的安全策略,如果比较重要的应用,你需要用更严格的安全策略。



拷贝所有的类除了客户端类。确认安全策略在policy.txt后,用下面命令开始服务器端应用。

命令行> java -Djava.security.policy=policy.txt FileServer

为了在不同的机器开始客户端应用,你需要拷贝 (FileInterface.class) 和(FileImpl_Stub.class).

命令行> java FileClient fileName machineName



翻译不当之处,请大家批评指正,谢谢!  My mail:lisong@anyi.com.cn




RMI(远程方法调用)和CORBA(通用对象调用代理架构)是两个最重要,并广泛应用的分布对象系统架构。每个架构都有优劣,这两个架构应用到从电子商务到医保系统等不同的领域。
两者中任何一个被应用到项目中都不是很容易的工作。这篇文章大概介绍了RMI和CORBA,并演示了如何开发一个远程下载文件的实例。

。介绍分布式对象系统

。介绍RMI和CORBA

。介绍一个RMI和CORBA的应用

。演示如何用RMI和CORBA从远程主机传输文件

。比较CORBA和RMI



C/S模式


客户机/服务器模式是服务器和客户机交换信息进行分布计算的一种模式。在这个模式里,客户机和服务器都用同一种语言—它们都理解的协议进行通信。
C/S模式有不同的开发方式,典型的应用是低层SOCKET开发。用SOCKET开发意味着我们必须设计一套协议,C/S双方能相互通信的一系列命令集。一个例子就是HTTP协议,提供了一个GET方法,为了得到传输的文档,C/S都必须实现。


分布式模式


基于系统的分布式对象是通过定义好的接口来隔离客户端请求和服务器端服务的对象集。

数据请求和执行是分开的,这是C/S模式与分布式模式的主要区别。


在一个分布式模型里,客户端发送消息给一个对象,这个对象判断消息决定哪种服务执行。

服务或者方法,SELECTION被对象或者代理来执行。RMI和CORBA就是这个模型的例子。



RMI
RMI是能使你很容易地开发分布市对象的系统。RMI比SOCKETS开发容易地多,不需要定义协议。用RMI,开发者会认为调用本地类的本地方法,实际上是从远程传输,翻译,并把结果传递到本地。



RMI应用起步
开发RMI,包括以下几个步骤:

1 定义一个远程接口

2 应用远程接口

3 服务器端开发

4 客户端开发

5 生成骨干代码,启动RMI注册,服务器,客户端



下面我们讲述每一步的具体实现。



例子:文件传输应用



允许传输任何类型的文件到远程主机。第一步定义描述方法的远程接口。

定义远程接口

代码一是下载文件的远程接口。接口FileInterface 提供了一个下载文件的方法,返回文件的字节集。

Code Sample 1: FileInterface.java

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface FileInterface extends Remote {
   public byte[] downloadFile(String fileName) throws
   RemoteException;
}




注意:

为了客户端能装载包含远程接口的远程对象,接口必须定义为Public

必须扩展Remote接口,为了实现远程对象

接口里的每个方法必须抛出RemoteException异常



应用远程接口
下一步是实现接口FileInterface,一个简单的应用在代码二。

注意为了实现接口FileInterface,类FileImpl必须扩展UnicastRemoteObject。

这说明类FileImpl创建一个单一,不能复制的通过TCP传输的RMI对象,

Code Sample 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);
         byte buffer[] = new byte[(int)file.length()];
         BufferedInputStream input = new
      BufferedInputStream(new FileInputStream(fileName));
         input.read(buffer,0,buffer.length);
         input.close();
         return(buffer);
      } catch(Exception e){
         System.out.println("FileImpl: "+e.getMessage());
         e.printStackTrace();
         return(null);
      }
   }
}


服务器端开发


第三步是开发服务器端,有三个步骤:

1 创建RMISecurityManager实例并安装它

2 创建一个远程对象的实例

3 用RMI注册对象。



Code Sample 3: FileServer.java

import java.io.*;
import java.rmi.*;

public class FileServer {
   public static void main(String argv[]) {
      if(System.getSecurityManager() == null) {
         System.setSecurityManager(new RMISecurityManager());
      }
      try {
         FileInterface fi = new FileImpl("FileServer");
         Naming.rebind("//127.0.0.1/FileServer", fi);
      } catch(Exception e) {
         System.out.println("FileServer: "+e.getMessage());
         e.printStackTrace();
      }
   }
}


这句 Naming.rebind("//127.0.0.1/FileServer", fi) 说明RMI 注册是运行在缺省端口1099。如果RMI注册是在其它端口,此句应改为: Naming.rebind("//127.0.0.1:4500/FileServer", fi)

客户端开发
下一步就是开发客户端。客户端远程调用远程接口定义的任何方法。为了实现,客户端必须先获得RMI注册的远程对象的实例。一旦获得,下载文件方法就别调用。如代码4。这个应用中,客户端接收两个命令行参数。

Code Sample 4: FileClient.java

import java.io.*;
import java.rmi.*;

public class FileClient{
   public static void main(String argv[]) {
      if(argv.length != 2) {
        System.out.println("Usage: java FileClient fileName machineName");
        System.exit(0);
      }
      try {
         String name = "//" + argv[1] + "/FileServer";
         FileInterface fi = (FileInterface) Naming.lookup(name);
         byte[] filedata = fi.downloadFile(argv[0]);
         File file = new File(argv[0]);
         BufferedOutputStream output = new
           BufferedOutputStream(new FileOutputStream(file.getName()));
         output.write(filedata,0,filedata.length);
         output.flush();
         output.close();
      } catch(Exception e) {
         System.err.println("FileServer exception: "+ e.getMessage());
         e.printStackTrace();
      }
   }
}


运行这个应用



为了运行这个应用,我们必须先生成骨干码,然后编译服务器端,客户端代码,RMI注册,最后开始应用。

为了生成骨干码,我们用RMIC命令:

命令行: rmic FileImpl

将生成两个文件: FileImpl_Stub.class 和 FileImpl_Skel.class. 客户端代理和服务端骨干。

下一步,编译SERVER,CLIENT代码

最后,开始RMI注册,运行。



命令行> rmiregistry portNumber



注册完成后,就可以开始服务器端应用。如果应用了RMI安全管理,你需要一个安全策略来处理。下面就是一个简单的security policy:

grant {
   permission java.security.AllPermission "", "";
};


注意:这只是一个简单的安全策略,如果比较重要的应用,你需要用更严格的安全策略。



拷贝所有的类除了客户端类。确认安全策略在policy.txt后,用下面命令开始服务器端应用。

命令行> java -Djava.security.policy=policy.txt FileServer

为了在不同的机器开始客户端应用,你需要拷贝 (FileInterface.class) 和(FileImpl_Stub.class).

命令行> java FileClient fileName machineName



翻译不当之处,请大家批评指正,谢谢!  My mail:lisong@anyi.com.cn
0
2
分享到:
评论

相关推荐

    使用RMI和CORBA进行分布式java程序设计

    【分布式Java程序设计:RMI与CORBA】 分布式程序设计是一种技术,允许不同计算机上的程序协同工作,仿佛它们都在同一台机器上运行。在Java世界中,RMI(Remote Method Invocation,远程方法调用)和CORBA(Common ...

    用RMI和CORBA进行分布式Java编程

    Java 远程方法调用(RMI)与公用对象请求代理体系(CORBA)是两种主要的分布式对象系统,广泛应用于各种行业,如电子交易和医疗保健。它们提供了跨越网络的远程对象调用的能力,实现了客户机/服务器模型的抽象化。 ...

    基于JAVA的分布式系统 RMI CORBA

    rmi corba 基于JAVA的分布式系统

    JAVA分布式程序设计

    本书覆盖了使用Java开发分布式应用程序的所有方面,包括Socket,RMI,CORBA,以及移动代理和Voyager。本书四部分之间相对独立,便于读者迅速掌握相关内容。另外,本书中包含了大量分布式程序的范例,这些范例将为...

    分布式计算的两种实现方案:Java RMI和CORBA.pdf

    本文主要介绍了两种实现分布式计算的方法:Java RMI(Remote Method Invocation)和CORBA(Common Object Request Broker Architecture)。 Java RMI是Java的核心API库,它允许Java程序在不同的虚拟机之间通信,...

    Java RMI 用于远程调用 进行分布式开发

    ### Java RMI 用于远程调用 进行分布式开发 #### 概述 Java RMI(Remote Method Invocation)是Java平台提供的一种实现分布式计算的技术,它允许开发者在不同JVM间进行方法调用,如同调用本地对象一样简单。通过...

    基于CORBA_JAVA RMI的分布式系统应用研究.pdf

    基于CORBA和JAVA RMI的分布式系统应用研究的目的是为了开发出一种基于Web的分布式管理系统,能够满足业务到业务和消费者到业务的多步骤交易过程中的复杂需求。该系统需要能够处理静态客户、非类型安全的交互、Web...

    Java 分布式程序设计

    本书覆盖了使用Java开发分布式应用程序的所有方面,包括Socket,RMI,CORBA,以及移动代理和Voyager。本书四部分之间相对独立,便于读者迅速掌握相关内容。另外,本书中包含了大量分布式程序的范例,这些范例将为...

    javaRMI完整版.pdf

    RMI 使得 Java 远程服务程序和访问这些服务程序的 Java 客户程序的编写工作变得轻松、简单,而 CORBA 则提供了一个更为复杂的分布式对象系统。 在 Java 分布式计算解决方案中,RMI 和 CORBA 均扮演着重要的角色。...

    rmi.rar_Java CORBA_corba_rmi

    Java RMI(Remote Method Invocation)和CORBA(Common Object Request Broker Architecture)是两种在分布式环境中实现对象间通信的重要技术。本教程将详细讲解这两个概念及其应用。 首先,让我们了解一下RMI。RMI...

    java rmi+corba实现的军舰游戏(battleships)

    本项目“java rmi+corba实现的军舰游戏(battleships)”就是这样一个典型的分布式系统应用实例,旨在帮助新手理解和掌握远程方法调用(RMI)与公共对象请求代理架构(CORBA)这两项核心技术。 首先,我们要了解Java ...

    Introduction to Java Distributed Objects - Using RMI and CORBA.pdf

    # Java分布式对象简介:使用RMI与CORBA ## 课程概述 本课程旨在介绍如何使用Java Remote Method Invocation (RMI) 和 Common Object Request Broker Architecture (CORBA) 进行分布式对象编程。对于希望深入了解...

    Java分布式应用学习笔记01分布式Java应用和SOA

    在深入探讨Java分布式应用和面向服务架构(SOA)之前,我们首先需要理解这两个概念的基本含义及其在现代IT系统中的重要性。 #### Java分布式应用 Java分布式应用是指利用Java编程语言构建的、运行在多台计算机上的...

    基于JAVA的分布式系统 RMI

    在Java中,RMI(Remote Method Invocation)和CORBA(Common Object Request Broker Architecture)是两种重要的分布式计算框架。 RMI是Java特有的远程方法调用机制,它使得开发者可以像调用本地对象的方法一样调用...

    JavaRMI分布式编程心得

    ### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...

    corba与java编程

    具体到RMI_CORBA,这是Java中实现CORBA的一种方式,即通过Java RMI与CORBA的结合,提供了一种在Java应用程序中使用CORBA服务的方法。Java RMI允许Java对象通过网络进行通信,而CORBA则扩展了这种能力,使其能够与...

    java_CORBA.rar_CORBA java_Java CORBA_corba

    描述中的"远程方法调用实现的小程序",意味着这个压缩包可能包含了一个简单的Java应用,该应用演示了如何使用CORBA进行远程方法调用(Remote Method Invocation, RMI)。RMI是Java语言的一个特性,用于实现Java对象...

    java corba demo

    Java CORBA(Common Object Request Broker Architecture)是一种中间件技术,用于构建分布式应用程序。它允许不同计算机上的对象相互交互,仿佛它们都在同一台机器上运行。Java CORBA与RMI(Remote Method ...

    分布式环境下Java RMI与RPC,JMS,CORBA,DCOM的比较

    ### 分布式环境下Java RMI与RPC,JMS,CORBA,DCOM的比较 在分布式计算领域,各种远程通信协议和技术被广泛采用以实现不同系统间的交互与数据共享。本文将详细介绍Java RMI(Remote Method Invocation)、RPC...

Global site tag (gtag.js) - Google Analytics