【程序员笔记】corba以及idlj使用笔记

一 关于环境问题

首先关于corba环境搭建可以参考我之前的文章【程序员笔记】Eclipse下搭建Corba开发环境,而对应的idlj是本身jdk自带的jar包,不需要做更多的操作。

二 关于原理问题

  1. 通过idl编写文档需求说明,利用类似于脚手架一样的东西快速的生成客户端的桩代码和服务器端的框架代码,然后客户通过自身需求去建立继续编写代码,最后运行即可。

  2. 在本地调用远程方法之后,在传到对应的POA(对象适配器),对象适配器会根据客户端的请求以及自身的POA策略找到适合的伺服对象,从而调用这个伺服对象上对应的方法,然后对应进行返回结果。

三 关于步骤问题

创建CORBA应用程序的过程大体如下:

● 编写IDL接口定义文件;

● 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;

● 基于服务器框架,编写服务对象实现程序;

● 基于客户端存根,编写客户对象调用程序;

● 分别编译客户对象和服务对象程序;

● 运行服务对象和客户对象程序;

四 关于实战问题

  1. 整体的项目结构如下,中间的包中的文件都是通过编译idl文件得到的,实际上需要我们自己动手编写的只有最开始的idl文件和client还有server包里面的文件。


    整体的项目结构
  2. CorbaTestImpl

import CorbaTest.GoldbashPOA;
public class CorbaTestImpl extends GoldbashPOA {
    public String checkNum(float a) {
        for(int j=2;j<(a/2+1);j++){
            if(isPrimeNum(j)&&isPrimeNum(a-j)){
                return "the number is "+(j-0.0)+" and "+(a-j);
            }
        }
        return "2332";
    }
      public Boolean isPrimeNum(float num){
            
            for(int i=2;i<(num/2+1);i++){
                if(num%i==0){
                  return false;
                }
            }
            return true;
        }
      }

3 server

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.InvalidName;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.AdapterAlreadyExists;
import org.omg.PortableServer.POAPackage.InvalidPolicy;
import org.omg.PortableServer.POAPackage.ObjectAlreadyActive;
import org.omg.PortableServer.POAPackage.ServantAlreadyActive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;

import CorbaTest.Goldbash;
import CorbaTest.GoldbashHelper;

public class Server {

    public static void main(String[] args)throws ServantNotActive, WrongPolicy, InvalidName, AdapterInactive, org.omg.CosNaming.NamingContextPackage.InvalidName, NotFound, CannotProceed, org.omg.CORBA.ORBPackage.InvalidName, AdapterAlreadyExists, InvalidPolicy, ServantAlreadyActive, ObjectAlreadyActive {
        
        args=new String[2];
        args[0]="-ORBInitialPort";
        args[1]="900";
        
        //初始化orb
        ORB orb = ORB.init(args, null);  
        
        // 取根POA的引用,并激活POAManager 
        org.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");  
        POA rootpoa = POAHelper.narrow(obj); 
        //激活POAManager
        rootpoa.the_POAManager().activate();  
           
        
        //创建一个Impl实例
        CorbaTestImpl corbatestImpl = new CorbaTestImpl();  
          
        //从服务中获得对象的引用
        org.omg.CORBA.Object ref = rootpoa.servant_to_reference(corbatestImpl);  
        Goldbash href = GoldbashHelper.narrow(ref);  
           
       //得到一个根名称的上下文
        org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");  
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
        //在命名上下文中绑定这个对象
        String name = "Hello";  
        NameComponent path[] = ncRef.to_name(name);  
        ncRef.rebind(path, href);  
        
        System.out.println("server start ");
        
        //启动等待客户端系统调用
        orb.run();  
  
     }  
                
}

4 client

package client;

import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import CorbaTest.Goldbash;
import CorbaTest.GoldbashHelper;
import server.CorbaTestImpl;

public class Client {
    
    
     static Goldbash corbaTestImpl;  
     
        static {  
            System.out.println("client开启连接server");  
               
          //初始化ip和端口号,-ORBInitialHost 127.0.0.1 -ORBInitialPort 900  
            String args[] = new String[4];  
            args[0] = "-ORBInitialHost";  
          //server端的IP地址,在HelloServer中定义的 
            args[1] = "127.0.0.1";  
            args[2] = "-ORBInitialPort";  
          //server端的端口,在HelloServer中定义的 
            args[3] = "900";  
              
            
               
            //创建一个ORB实例  
            ORB orb = ORB.init(args, null);  
               
         // 获取根名称上下文  
            org.omg.CORBA.Object objRef = null;  
            try {  
            objRef = orb.resolve_initial_references("NameService");  
            } catch (InvalidName e) {  
                e.printStackTrace();  
            }  
            NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);  
               
            String name = "Hello";  
            try {  
                
                  
                //通过ORB拿到了server实例化好的实现类  
                corbaTestImpl = GoldbashHelper.narrow(neRef.resolve_str(name));  
            } catch (NotFound e) {  
                e.printStackTrace();  
            } catch (CannotProceed e) {  
                e.printStackTrace();  
            } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {  
                e.printStackTrace();  
            } 
        }
            
             
        public static void main(String args[]) throws Exception {  
             float a=12;
             String str = corbaTestImpl.checkNum(a);  
                System.out.println(str);  
        }  
}

5 比较重要的一点在于项目启动顺序
要先到自己的本机的jdk的bin目录下执行 tnameserv命令,当出现如下界面之后再依次启动服务器端和客户端。

五 关于idlj问题

这个和corba的整体流程几乎是一样的,只是在最开始编译的时候不需要这么麻烦的设定各种位置,只要在项目的idl文件所在位置直接执行

idlj  idlname.idl

在当前目录下就会有我们所需要的这几个文件了,然后放到自己的项目目录下即可。

最后本篇主要参考文章如下。

本项目github地址
CORBA学习与实践
RMI、CORBA、IIOP简单实例--2. CORBA

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,672评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,645评论 18 399
  • 一、OMG 1.成立于1989年的非盈利性联盟; 2. 以促进在分布式系统开发中面向对象技术的理论与实践的发展...
    容探录阅读 10,428评论 2 1
  • 一. Java基础部分.................................................
    wy_sure阅读 3,811评论 0 11
  • 照片并不能表达人们曾经所看到的,它是片面的,瞬间的,并不完整。当你身处其中,感受风吹过皮肤,听到河水流淌的声音,闻...
    阿斩阅读 338评论 0 2