zoukankan      html  css  js  c++  java
  • CORBA简介

    使用.NET开发corba应用 
    一、 什么是IIOP.NET 
    IIOP.NET 是通过使用基于corba的IIOP支持.NET、javaEE和corba组件实现无缝互操作的技术。如图1.1所示,这种解决方案依赖于.NET Remoting 体系结构的可扩展性,以提供透明的对象级的集成,同时不会导致网关或基于 SAOP 产品引起的性能上的开销。

    图1.1 
    二、 为什么使用IIOP.NET 
    现今基于.net开发corba应用程序的工具主要有:janeva,IIOP.NET, Remoting.Corba。其中,janeva 是Borland公司发布的一个新产品,但其缺点是不开源,并且收费;Remoting.Corba 是一个开源的项目,但由于处于初始开发阶段,许多功能尚不具备,比如编译IDL文件,某些corba 类型参数也不支持;IIOP.NET 也是一个开源的开发项目,相关的功能也已经成熟,其优势主要体现在, 
    (1) 性能。IIOP 比SOAP 更轻量级,更有效; 
    (2) .NET Remoting通道像它连接的对象一样共享相同的进程,而且既不需要分开的网关, 也不需要另外的间接层; 
    (3) 可靠性。IIOP定义了至多一次调用的语法规则,确保方法调用只处理一次; 
    (4) 可用性。IIOP.NET提供了灵活强大的CORBA模型,被集成在直观的.NET Remoting 中。 
    三、 通过IIOP.NET 技术建立的一个系统集成解决方案 
    1. 建立IIOP.NET开发环境 
    (1) IIOP.NET下载地址:http://iiop-net.sourceforge.net/index.html;目录结构如图3.1。由于官方网站上只提供了该项目的源文件,故需要下载到本地后,进行手工编译,执行nmake命令,生成dll 文件,供程序引用。(编译前需要拷贝jdk/lib 目录下的ir.idl 和 orb.idl 文件到IIOP.NET的idl目录,编译完成后会在响应的工程文件夹中生成dll文件或exe文件,并加以使用。这里会使用到IIOPChannel.dll,以及IDLToCLSCompiler.exe 两个文件。编译方法参见解压包中的Readme.txt)

    图3.1 
    将Microsoft Visual Studio 安装目录下的 VCin,添加到系统环境变量path中;(例如D:Program FilesMicrosoft Visual Studio 9.0VCin) 
    (2) 编译IDL文件。执行命令 IDLToCLSCompiler hi hi.idl ; 命令执行完后,会生成hi.dll文件,里面为idl文件定义的一些接口。(命令详解网址:http://iiop-net.sourceforge.net/faq.html) 
    2. IIOP.NET实现客户端 
    使用IIOP.NET来实现客户端通过4个步骤完成: 
    (1) 为服务器对象生成IDL 描述; 
    (2) 使用 IIOP.NET 工具 IDLTOCLSCompiler 从IDL生成代理类; 
    (3) 注册IIOP.NET 通道; 
    (4) 使用代理类。 
    3. IIOP.NET实现服务器端 
    (1) 定义所需的接口,即IDL文件; 
    (2) 使用IDLTOCLSCompiler 命令从IDL文件生成代理类。例如IDLTOCLSCompiler ProxyClasses orb.idl ;最终生成ProxyClasses.dll,包含定义类型的代理类,所有文件必须在正确的目录下。 
    (3) 注册IIOP.NET 通道,连接服务器,访问远程对象,实现.NET Web 服务。 
    注册通道并获取对象的引用来配置 Web 服务,程序如下: 
    Public class Global:System.Web.HttpApplication{ 
    Protected void Appplication_Start (Object sender, EventArgs e){ 
    IiopChannel channel = new IiopChannel();//建立IIOP通道 
    m_factory=GetFactory(); //代理类 
    remotingServices.RegisterChannel(channel); //注册IIOP通道 
    CorbaInit init = CorbaInit.getInit(); //客户端corba初始化 
    NamingContext nameService =(NamingContext)init.Get- NameService(Host,port); //生成命名服务 
    NameComponent[] name = new NameComponent[] { new NameComponent(“Factory”), //绑定对象,服务 
    Factory factory=(Factory)nameService.resolve(name);//根据绑定的对象名称,获得对象 
    …… 


    (4) 对象实现,提供服务。 
    四、 IIOP.NET开发深圳医保接口实例 
    1. IOR文件介绍 
    Interoperable Object Reference,可互操作对象引用;基于IOR能够实现CORBA对象定位。IOR 是一个数据结构,它提供了关于类型、协议支持和可用 ORB 服务的信息。 
    2. 编译IDL文件 
    执行命令IDLTOCLSCompiler hi hi.idl,会在IDLTOCLSCompiler.exe 所在目录生成hi.dll 文件。 
    3. 获取IOR文件 
    http://as170.szsi.gov.cn/szsb/hisi.html 获取ior 文件,用于与服务器建立连接。 
    4. 添加项目引用 
    建立客户端项目,并添加之前生成的hi.dll 以及 IIOPChannel.dll 引用。 
    5. 客户端示例程序 
    using System; 
    using System.Runtime.Remoting; 
    using System.Runtime.Remoting.Channels; 
    using Ch.Elca.Iiop; 
    using Ch.Elca.Iiop.Services; 
    using omg.org.CosNaming; 
    namespace hi.modMZ 

    class Program 

    static void Main(string[] args) 

    try 

    // 建立并注册IIOP通道,与服务器corba进行通信 
    IiopClientChannel channel = new IiopClientChannel(); 
    ChannelServices.RegisterChannel(channel,false); 
    //本地corba初始化 
    CorbaInit init = CorbaInit.GetInit(); 
    //ior文件中内容,也可从ior文件中读取 
    string ior = “IOR:000000000000002B49444C3A6F6D672E6F72672F436F734E616D696E672F4E616D696E67436F6E746578744578743A312E300000000000020000000000000078000102000000000F36312E3134342E3235332E3131370000271000000000001F5374616E646172644E532F4E616D655365727665722D504F412F5F726F6F7400000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C0000000000000001000000010000001C00000000000100010000000105010001000101090000000105010001”;
    //根据ior字符串获取对方命名服务 
    NamingContext nameService = (NamingContext)RemotingServices.Connect(typeof(NamingContext), ior); 
    //根据对象绑定的服务名获取远程对象 
    NameComponent[] name = new NameComponent[] { new NameComponent(“MZYL”, “Service”) }; 
    string yljgbm = “H0920”; 
    string ylzh = “%***************************************”; 
    string pass = “”; 
    string zzyybm = “*“; 
    string czybm = “*“; 
    string czy = “*“; 
    short[] czyxm = transfromSA(czy);

                hi.GRXX hr; 
    
                intMZ mz = (intMZ) nameService.resolve(name); 
                Console.WriteLine(); 
    
                //测试方法             
                short[] res = mz.GetGRJBXX(yljgbm, ylzh, pass, czybm, czyxm, out hr); 
                Console.WriteLine(TransformAS(res)); 
                Console.WriteLine(hr.ACCOUNT); 
                Console.WriteLine(hr.YLZH); 
                Console.WriteLine(hr.XB); 
                Console.WriteLine("finished!"); 
            } 
            catch (Exception e) 
            { 
                Console.WriteLine("exception: " + e); 
            } 
        } 
        //string类型转为short[] 
        public static short[] transfromSA(string strArray) 
        { 
            short[] shortArray = new short[strArray.Length]; 
            char[] chars = strArray.ToCharArray(); 
            for (int i = 0; i < strArray.Length;i++ ) { 
                shortArray[i] = transCharToShort(chars[i]); 
            } 
            return shortArray; 
        } 
    
        public static short transCharToShort(char c) { 
            char[] t = new char[1]; 
            t[0] = c; 
            string strTemp = new string(t); 
            byte[] cc = System.Text.Encoding.Default.GetBytes(strTemp); 
            if (cc.Length == 1) 
            { 
                return (short)(cc[0] < 0 ? cc[0] + 256 : cc[0]); 
            } 
            int v1 = cc[0] < 0 ? cc[0] + 256 : cc[0]; 
            int v2 = cc[1] < 0 ? cc[1] + 256 : cc[1]; 
            return (short)(v1 * 256 + v2); 
        } 
        //short[] 转为string类型 
        public static string TransformAS(short[] sArray) 
        { 
            char[] charArray = new char[sArray.Length]; 
            for (int i = 0; i < sArray.Length; i++) 
            { 
                charArray[i] = TransShortToChar(sArray[i]); 
            } 
            return new String(charArray); 
        } 
        private static char TransShortToChar(short sTemp) 
        { 
            if (sTemp >= 0) 
            { 
                return (char)sTemp; 
            } 
    
            byte[] b = new byte[2]; 
            b[0] = (byte)(sTemp >>; 
            b[1] = (byte)sTemp; 
            string strTemp = System.Text.Encoding.Default.GetString(b); 
            char[] charArrTemp = strTemp.ToCharArray(); 
            return charArrTemp[0]; 
        } 
    } 
    

    }

    1. 测试输出。 
      程序正常输出结构体GRXX中的信息,说明能与服务器端正常通讯,进行数据交换。如程序出现异常,一般表现为: 
       未能与服务器建立连接(如ior文件错误,或网络连接失败); 
       服务名填写错误(如门诊服务名为:”MZYL”,”Service”,一旦服务名填写错误,不能获取服务器端门诊服务对象。) 
       本地测试某些方法时,传入的参数为空; 
       服务器端某些方法的实现有问题。 
      五、 结束语 
      本文通过分析使用.NET应用IIOP.NET开发深圳医保接口的示例,阐释了使用C#开发corba应用程序的流程。通过采用IIOP.NET 能够达到企业级应用系统的无缝集成的要求,IIOP.NET 具有可靠性高,可用性强,紧耦合等特点,并且这个技术是一个开源项目,拥有 LGPL 许可证,因此,它是一种理想的企业级应用工具和应用系统解决方案。
     
    0
  • 相关阅读:
    Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】
    线性表的链式存储结构
    Java精通并发-同步方法访问标志与synchronized关键字之间的关系
    Java精通并发-透过字节码理解synchronized关键字
    解决com.fasterxml.jackson.databind.JsonMappingException: No suitable
    mybatis绑定错误-- Invalid bound statement (not found)
    java.sql.SQLException: **** [SQLServer]对象名 "XXXX"无效
    Missing URI template variable 'XXXX' for method parameter of type String
    Unrecognized token 'XXXX': was expecting ('true', 'false' or 'null')
    ajax的data传参的两种方式
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/7511208.html
Copyright © 2011-2022 走看看