组件化开发方法

一. 题目分析

题目1.Java版CORBA程序1——HelloWorld
题目2.JAVA版CORBA程序2——Counter
要求:
编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。

分析:CORBA与Java的相互关系
CORBA不只意味着对象请求代理(ORB),它还是非常全面的分布式对象平台。CORBA使JAVA应用可以跨越网络、语言以及操作系统,并为JAVA提供了一组分布服务,如分布式自我观察、动态发现、事务、关系、安全和命名等。
JAVA不仅是一种语言,它还是一个动态代码系统,它对运行对象来说是一个可移植的虚拟机(JVM)。JAVA为开发、管理、发布Client/Server应用提供了更简单的方式。人们可以通过将应用放在一个Web服务器上将这一应用发布给成千上万个用户,而不必关心它的安装和升级。JAVA还非常适合服务器的开发,它可以动态地将服务代码移向最需要它们的地方。
JAVA将会使CORBA对象能够运行在从主机、网络计算机到蜂窝电话等可编程的各种机器上,并简化了大型CORBA系统的代码发布。对客户和服务对象来说JAVA是很理想的编程语言,JAVA内置的多线程、垃圾收集和错误处理使编写健壮的网络对象变得很容易。
这两种对象模型可以很好地相互补充,CORBA处理网络的透明性,JAVA处理实现的透明性,CORBA为JAVA可移植应用环境提供了一个分布式的结构。

步骤:
1.配制环境JDK环境。
这个是基础步骤,一定要配置好,否则命令无法执行。
2.编写编译IDL接口。
在IDL接口的代码里面注意返回值的类型,若要处理中文内容应该用wstring关键字。
3.编写编译服务端程序
4.编写编译客户端程序
5.运行
分别打开3个DOS界面窗口执行如下命令

  • 启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
  • 启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050
  • 启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050

二. CORBA模型分析

CORBA体系结构主要由对象实现,公共对象请求代理,IDL存根和框架,对象适配器OA,借口存储库,实现存储库等组成。
在这里插入图片描述
图1.组件结构图

题目1.Java版CORBA程序1——HelloWorld
1 .编写IDL接口HelloWorld.idl:
module sample{
interface HelloWorld{
string sayHello();
};
};
CORBA处理字符串有String和wstring两种类型,string类型主要用于处理ASCII类型的字符串。添加中文内容时应使用wstring,它可以用于处理多字节字符串。

2.编译IDL接口:X:\corba>idlj –fall HelloWorld.idl
利用idlj命令可以将idl文件可以转成java代码的,然后导入到项目中编译。
编译结果生成sample包,生成下述文件
_HelloWorldStub.java
HelloWorld.java
HelloWorldHelper.java
HelloWorldHolder.java
HelloWorldOperations.java
HelloWorldPOA.java

3.编写并编译服务端程序:HelloWorldServer.java(在服务端实现接口并发布。)

4.编写并编译客户端程序: HelloWorldClient.java(在客户端调用)

这两步的java文件要建立在sample包的同级目录下别忘记用javac命令编译。

5.运行

  • 启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
    (Bin目录下的tnameserv.exe功能是提供命名服务的接口。)

  • 启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050

  • 启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050
    特别需要注意的是,名字服务器、服务端和客户端要分别启动一个DOS命令提示符界面。

这里还可采用批处理命令启动相应程序,只需在后面添加@pause

题目2.JAVA版CORBA程序2——Counter
要求:
编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。
实现详解:

1 .编写IDL接口counter.idl:
module CounterApp{
interface Counter{
readonly attribute long value;
void inc();
void dec();
};
};

2编译IDL接口:X:\corba>idlj –fall counter.idl
编译结果生成CounterApp包,生成下述文件
_CounterStub.java
Counter.java
CounterHelper.java
CounterHolder.java
CounterOperations.java
CounterPOA.java

3 编写并编译对象实现代码:CounterImpl.java

4 编写并编译服务端程序: Server.java

5 编写并编译客户端程序: Client.java

6.运行

  • 启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
  • 启动服务端程序:X:\corba >java Server -ORBInitialPort 1050
  • 启动客户端程序:X:\corba >java Client -ORBInitialPort 1050

三.组件实现

题目一:
1.IDL接口HelloWorld.idl:

module sample{
interface HelloWorld{ 
string sayHello();   
};  
};

2.HelloWorldServer.java

import sample.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
class HelloWorldServant extends HelloWorldPOA{   //对象实现类
public String sayHello(){
return "\nHello World!\n";
}
}
public class HelloWorldServer{                  //服务程序
public static void main(String args[]){
try{
//初始化ORB
ORB orb = ORB.init(args, null);
//取根POA的引用
org.omg.CORBA.Object poaobj = orb.resolve_initial_references ("RootPOA");
org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
//创建伺服对象 
HelloWorldServant objRef = new HelloWorldServant();
HelloWorld obj = objRef._this(orb);
//绑定命名服务 
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
NameComponent nc = new NameComponent("Hello", ""); 
NameComponent path[] = {nc}; 
ncRef.rebind(path, obj);
//激活POA管理器 
manager.activate();
//等待处理客户程序的请求
System.out.println("HelloWorld is running!");
orb.run();
}catch (Exception e) { 
System.err.println("ERROR: " + e); 
e.printStackTrace(System.out); 
}
}
}

3.HelloWorldClient.java

import sample.*; 
import org.omg.CosNaming.*; 
import org.omg.CORBA.*; 
public class HelloWorldClient { 
public static void main(String args[]) { 
try{
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); 
NamingContext ncRef = NamingContextHelper.narrow(objRef); 
NameComponent nc = new NameComponent("Hello",""); 
NameComponent path[] = {nc}; 
HelloWorld helloWorld = HelloWorldHelper.narrow(ncRef.resolve(path)); 
String hello = helloWorld.sayHello(); 
System.out.println(hello); 
} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out); 
}
}
}

题目二:
1 .编写IDL接口counter.idl:

module CounterApp{   
    interface Counter{   
        readonly attribute long value;   
        void inc();   
        void dec();   
    };   
};

2.CounterImpl.java

import CounterApp.*;
public class CounterImpl extends CounterPOA {
    private int count;   
    public CounterImpl(){   
        count = 0;   
    }   
    public void inc(){   
        count++;   
    }   
    public void dec(){   
        count - -;   
    }   
    public int value(){   
        return count;   
    }   
}

3.Server.java

import CounterApp.*;   
import java.io.*;   
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
public class Server {
public static void main(String[] args){
try{
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object poaobj = orb.resolve_initial_references ("RootPOA");
org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
CounterImpl c_impl = new CounterImpl();
Counter c = c_impl._this(orb);
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
NameComponent nc = new NameComponent("Count", "");
NameComponent path[] = {nc}; 
ncRef.rebind(path, c);
FileOutputStream file = new FileOutputStream("Counter.ref");
PrintWriter writer = new PrintWriter(file);
String ref = orb.object_to_string(c);
writer.println(ref);
writer.flush();
file.close();
System.out.println("Server started."+" Stop:Ctrl-c");
rootPOA.the_POAManager().activate();
orb.run();
}catch(IOException ex){
System.out.println("File error:"+ex.getMessage());
System.exit(2);
}catch(Exception ex){
System.out.println("Exception: "+ex.getMessage());
System.exit(1);
}
}
}

4.Client.java

import CounterApp.*;  
import java.util.*;   
import java.io.*;   
import org.omg.CORBA.*; 
import org.omg.CosNaming.*; 
public class Client {   
public static void main(String[] args){   
try{   
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object obj = orb.resolve_initial_references("NameService"); 
NamingContext ncRef = NamingContextHelper.narrow(obj); 
NameComponent nc = new NameComponent("Count",""); 
NameComponent path[] = {nc};
String ref = null; 
try{   
Scanner reader = new Scanner(new File("Counter.ref"));   
ref = reader.nextLine();   
}catch(IOException ex){   
System.out.println("File error: "+ex.getMessage());   
System.exit(2);   
}   
obj = orb.string_to_object(ref);   
if(obj == null){   
System.out.println("Invalid IOR");   
System.exit(4);   
}   
Counter c = null;   
try{   
c = CounterHelper.narrow(obj);   
}catch(BAD_PARAM ex){   
System.out.println("Narrowing failed");   
System.exit(3);   
}   
int inp = -1;   
do{   
System.out.print("Counter value: "+c.value()+"\nAction(+/-/e)?");   
System.out.flush();   
do{   
try{   
inp = System.in.read();   
}catch(IOException ioe){}   
}while(inp != '+' && inp != '-' && inp != 'e');   
if(inp == '+')   
c.inc();   
else if(inp == '-')   
c.dec();   
}while(inp != 'e');   
}catch(Exception ex){   
System.out.println("Exception: "+ex.getMessage());   
System.exit(1);   
}   
}   
}

四.测试、调试及运行结果

调试过程:
在执行idlj –fall HelloWorld.idl命令时,出现了一下的错误
在这里插入图片描述

最开始以为是环境变量没配置好,重新配置了一遍后发现仍然无法解决。然后在Java的安装目录下的bin文件里查找了一下,根本找不到idlj这条命令的相关文件。换了一个jdk的版本后终于有了这个文件。
在这里插入图片描述

第一个问题解决。进行下一步的时候又出现了一个问题,
在这里插入图片描述

发生了找不到或无法加载主类的问题。仔细对比了一下名称并没有发现敲错了。之后才回忆起用命令行实现java是有步骤的,必须先用javac命令将.java文件转化为.class文件,才能用java命令加载文件。第二个问题解决,成功执行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(不过这里不清楚为什么会提示不安全,不影响后面的操作)
在字符串中加入中文时,中文内容显示不出来。原来是string类型主要用于处理ASCII类型的字符串,wstring用于处理多字节例如中文的字符串。在HelloWorld.idl文件里把string改成wstring成功显示了中文的内容。

结果:题目一:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将字符串内容改成了含中文的内容
在这里插入图片描述

题目二:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五.经验归纳
(1)初期在进行命令行多次出现了javac不是处理命令的问题。一般这样的问题就是环境变量没有配制好,要回去好好检查JAVA_HOME,Path,classpath的值有没有对。而且做完这个练习发现bin目录下有很多命令在将来的使用中是非常重要的,需要去了解。

(2)Java的运行机制。(操作过程中因为不熟悉Java的运行机制停滞了很长时间……)Java运行时必须要经过编译和运行两个步骤。首先使用javac命令将扩展名为java的源文件进行编译,编译结束后会自动生成一个后缀为class的字节码文件。最后再使用java命令启动Java虚拟机将字节码文件进行解释执行并将结果显示出来。而在这之前使用idlj命令将idl文件转化为java文件。

(3)在真正使用之前完全不了解CORBA的用处,做练习也是机械地按照步骤来操作。做完了之后才对CORBA有了更深的体会。
CORBA是一种远程分布式方法调用,是服务器端和客户端传输数据的方式。CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。
使用CORBA,用户可以透明地访问信息,并不需要知道信息存在于什么软件中、使用什么硬件平台,以及位于企业网络的什么地方。作为面向对象系统的通信核心,CORBA为今天的计算环境带来了真正的互操作性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值