程序设计方法学中的CORBA(组件化开发方法)

一.问题描述
1.Java版CORBA程序1——HelloWorld注意事项:
①要转到class文件所在目录启动相应程序;
②名字服务器、服务端和客户端要分别启动一个DOS命令提示符界面。
③可采用批处理命令启动相应程序,分别为:a.启动名字服务器:tnameserv -ORBInitialPort 1050@pause
b.启动服务器端程序:java HelloWorldServer -ORBInitialPort 1050@pause
c.启动客户端程序: java HelloWorldClient -ORBInitialPort 1050@pause
④要求编写实现显示“Hello,World!+班级+中文姓名”字符串。
2. JAVA版CORBA程序2——Counter
3. 要求:编写实现连加、连减和加减混合等数学++/- -运算,并进行测试。
4. 目的:①掌握组件化开发的概念,了解CORBA模型及ORB机制;
②掌握CORBA组件编程方法。
二.具体步骤
1.实现HelloWorld!+班级,姓名
①创建一个文件夹HelloApp,在该文件夹下面创建文本文档:HelloWorld.idl,并添加代码:

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

②在命令提示符指定文件目录下面写:idlj -fall HelloWorld.idl;
在这里插入图片描述
执行完之后会出现sample文件夹:
在这里插入图片描述
③在创建文本文档HelloWorld.idl下创建两个java文档:HelloWorldServer.java和HelloWorldClient.java并添加代码:
在这里插入图片描述
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!\t\t软工1704班-张梦茹;
   } 
}
public class HelloWorldServer{     
             //服务程序
             public static void main(String args[]){
             try{
             //初始化
             ORBORB 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);
                  }
          }
  }

④在命令提示符下面执行两条语句:
javac HelloWorldServer.java
javac HelloWorldClient.java
⑤HelloApp文件下面会出现class文档:
在这里插入图片描述
⑥最后执行三条语句:启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
在这里插入图片描述
启动服务端程序:X:\corba >java HelloWorldServer -ORBInitialPort 1050
输出:HelloWorld is running
在这里插入图片描述
启动客户端程序:X:\corba >java HelloWorldClient -ORBInitialPort 1050
输出:Hello World! 专业班级+姓名
在这里插入图片描述
2.实现连加、连减和加减混合等数学++/- -运算
①创建件夹文件夹Counter,并在该文件夹下面创建文本文档counter.idl,并添加代码:
在这里插入图片描述
②在命令提示符指定文件目录下面写:idlj -fall counter.idl
在这里插入图片描述
出现如下的文件夹:
在这里插入图片描述
③在创建文本文档counter.idl下创建三个java文档:Server.java和Client.java和CounterImpl.java并添加代码: Server.java文档:
在这里插入图片描述
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);
        }
     }
 }

Client文档:

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

④在命令提示符下面执行两条语句:
javac Server.java
javac Client.java
⑤Counter文件下面会出现class文档:

在这里插入图片描述

⑥最后执行三条语句:
启动名字服务器:X:\corba >tnameserv -ORBInitialPort 1050
启动服务端程序:X:\corba >java Server -ORBInitialPort 1050
输出:Server started. Stop: Ctrl-c
启动客户端程序:X:\corba >java Client -ORBInitialPort 1050
三.调试
1.如果出现了如下问题,需要修改sample文件中HelloWorldPOA.java文档中的代码:
在这里插入图片描述
添加红色部分就可以:(方法参考网上修改的)
参考:https://blog.csdn.net/cangbij/article/details/83684843
在这里插入图片描述

四.测试
1.实现HelloWorld+班级姓名:
在这里插入图片描述
2.实现自增自减:

在这里插入图片描述
在这里插入图片描述
进行自增自减:
在这里插入图片描述
五.总结
在这次上机作业中,我总结一下我遇到的问题:
1.第一次在命令提示符下面运行程序:不会转到指定的盘的文件夹目录下,通过百度我找到了一种方法;
2.然后就是运行过程中:首先是命令符,稍微不注意就会写错,一开始的程序是运行“HelloWorld!”,因为要改成HelloWorld!+班级姓名,因此只需将HelloWorld.idl文档中的string改为wstring,然后就是将HelloworldServer.java文档中的Hello方法重写:

public String sayHello() {
   return "\nHello World!\t\t软工1704班-张梦茹";
}

3.就是在后面启动服务端的时候,出现了端口错误,这时将端口号1050改为1051即可解决问题。
不同电脑出现的问题也不相同,这个仅供参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值