第五章 组件化开发方法

    xiaoxiao2023-10-13  144

    一、题目:

    实验目的

    1.     掌握组件化开发的概念,了解CORBA模型及ORB机制;

    2.     掌握CORBA组件编程方法。

    实验内容

    步骤:

    1.配制环境JDK环境。

    2.编写编译IDL接口。

    3.编写编译服务端程序。

    4.编写编译客户端程序。

    5.运行测试与调试。

    6.完成报告。

    二、CORBA模型分析

    三、组件实现

    题目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

    编译结果生成sample包,生成下述文件

    _HelloWorldStub.java

    HelloWorld.java

    HelloWorldHelper.java

    HelloWorldHolder.java

    HelloWorldOperations.java

    HelloWorldPOA.java

    3 编写并编译服务端程序: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);

    }

    }

    }

    4 编写并编译客户端程序: 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);

    }

    }

    }

    5 运行

    启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050

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

    输出:HelloWorld is running

    启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050

    输出:Hello World!

    注意事项:

    1、要转到class文件所在目录启动相应程序;

    2、名字服务器、服务端和客户端要分别启动一个DOS命令提示符界面。

    3、可采用批处理命令启动相应程序,分别为:

    (1)启动名字服务器:

    tnameserv -ORBInitialPort 1050

    @pause

    (2)启动服务器端程序:

    java HelloWorldServer -ORBInitialPort 1050

    @pause

    (3)启动客户端程序:

    java HelloWorldClient -ORBInitialPort 1050

    @pause

    4、要求编写实现显示“Hello,World!+班级+中文姓名”字符串。

    题目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

    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;

    }

    }

    4 编写并编译服务端程序: 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©;

    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);

    }

    }

    }

    5 编写并编译客户端程序: 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);

    }

    }

    }

    5 运行

    启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050

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

    输出:Server started. Stop: Ctrl-c

    启动客户端程序:X:\corba >java Client -ORBInitialPort 1050

    最新回复(0)