<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-109  評論-187  文章-25  trackbacks-0
    上篇文章講述了jacorb 的配置,本章講敘其應用,隨后的幾篇文章會重點講述corba的開發
     

    JACORB開發以及corba的請求方式:

       JacORB的應用開發一般分為以下五步:

    1.IDL接口定義

    2.編譯IDL接口定義生成Java

    3.實現步驟2中生成的接口

    4.寫服務器啟動類,并注冊到ORB

    5.寫客戶端去獲取服務對象引用

     

    本例子是采用JACORB里面的一個GRID的例子,從這里例子我們能看出CORBA開發的一些基本步驟,猶豫本例子采用的都是JAVA開發的,由于也受到JACORB的框架限制,并不能很好看出跨語言平臺以及如何做到分布式的開發,但是本例 2種基本的方式能夠展現出來corba兩中            調用方式:

       第一種方式:根據server生成的IDL以及IOR文件,交給客戶端,客戶端根據這IOR文件來定位server,然后根據IDL接口生成自己的調用代碼(本例中是JAVA,當然也可以自己用別的語言來實現)

       第二種方式:根據Naming Service 的方式來定位server,有點類似于JNDI的方式,有個Naming Server server端把一些服務注冊上去,clientnaming server來找這些服務.

     

    以上是2種最基本的方式來實現 CORBA的這2種調用方式,第一種方式雖然麻煩一點,但是也是很有效的。本例子用JAVA實現的serverClient 充分的展示了這2種調用方式

     

     1.IDL接口定義

     

      全部Corba結果是從一個接口開始的,因為Corba與語言無關,所以它依靠一種接口定義語言來表達如何向實現接口的服務發出請求以及得到應答.

     這是Jacorb里面Grid的例子,IDL的詳細語法可以去OMG找些相關的資料來看,比較簡單

    grid.idl

    // IDL defintion of a 2-D grid:

     

    module demo

    {

    module grid

    {

        interface MyServer

        {

        typedef fixed <5,2> fixedT;

        readonly attribute short height;  // height of the grid

        readonly attribute short width;   // width of the grid

        // set the element [n,m] of the grid, to value:

        void set(in short n, in short m, in fixedT value);

        // return element [n,m] of the grid:

        fixedT get(in short n, in short m);

        exception MyException

        {

            string why;

        };

        short opWithException() raises( MyException );

        };

    };

    };

    我們用這樣一個與任何語言無關的IDL文件將來生成一些與語言相關一些文件,這些文件里面定義了 包名,類名,方法名.

    2.編譯IDL接口定義生成Java

    根據下圖就可以看出來生成的文件哪些是server的那些client

     

     

    3.實現步驟2中生成的接口

    package demo.grid;

    /**

    * A very simple implementation of a 2-D grid

    */

    import demo.grid.MyServerPackage.MyException;

    public class gridImpl extends MyServerPOA

    {

    protected short height = 31;

    protected short width = 14;

    protected java.math.BigDecimal[][] mygrid;

    public gridImpl()

    {

    mygrid = new java.math.BigDecimal[height][width];

    for( short h = 0; h < height; h++ )

    {

    for( short w = 0; w < width; w++ )

    {

    mygrid[h][w] = new java.math.BigDecimal("0.21");

    }

    }

    }

    public java.math.BigDecimal get(short n, short m)

    {

    if( ( n <= height ) && ( m <= width ) )

    return mygrid[n][m];

    11

    else

    return new java.math.BigDecimal("0.01");

    }

    public short height()

    {

    return height;

    }

    public void set(short n, short m, java.math.BigDecimal value)

    {

    if( ( n <= height ) && ( m <= width ) )

    mygrid[n][m] = value;

    }

    public short width()

    {

    return width;

    }

    public short opWithException()

    throws demo.grid.MyServerPackage.MyException

    {

    throw new demo.grid.MyServerPackage.MyException("This is only

    a test exception,

    }

    }

    4.寫服務器啟動類,并注冊到ORB

    MyServer接口來訪問。以下是個類的源代碼:

    package demo.grid;

    import java.io.*;

    import org.omg.CosNaming.*;

    public class Server

    {

    ////// public static void main( String[] args )

    {

    org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

    try

    {

    org.omg.PortableServer.POA poa =

    org.omg.PortableServer.POAHelper.narrow(

    orb.resolve_initial_references("RootPOA"));

    poa.the_POAManager().activate();

    org.omg.CORBA.Object o = poa.servant_to_reference(new

    gridImpl());

    if( args.length == 1 )

    {

    // write the object reference to args[0]

    PrintWriter ps = new PrintWriter(

    new FileOutputStream(

    new File( args[0] )));

    ps.println( orb.object_to_string( o ) );

    ps.close();

    }

    else

    {

    // register with the naming service

    NamingContextExt nc =

    NamingContextExtHelper.narrow(

    orb.resolve_initial_references("NameService"));

    nc.bind( nc.to_name("grid.example"), o);

    12

    }

    }

    catch ( Exception e )

    {

    e.printStackTrace();

    }

    orb.run();

    }

    }

    5.寫客戶端去獲取服務對象引用

    package demo.grid;

    import org.omg.CosNaming.*;

    public class Client

    {

    public static void main(String args[])

    {

    try

    {

    MyServer grid;

    org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);

    if(args.length==1 )

    {

    // args[0] is an IOR-string

    grid =

    MyServerHelper.narrow(orb.string_to_object(args[0]));

    }

    else

    {

    NamingContextExt nc =

    NamingContextExtHelper.narrow(

    orb.resolve_initial_references("NameService"));

    grid = MyServerHelper.narrow(

    nc.resolve(nc.to_name("grid.example")));

    }

    short x = grid.height();

    System.out.println("Height = " + x);

    short y = grid.width();

    System.out.println("Width = " + y);

    x -= 1;

    y -= 1;

    13

    System.out.println("Old value at (" + x + "," + y +"): " +

    grid.get( x,y));

    System.out.println("Setting (" + x + "," + y +") to 470.11");

    grid.set( x, y, new java.math.BigDecimal("470.11"));

    System.out.println("New value at (" + x + "," + y +"): " +

    grid.get( x,y));

    try

    {

    grid.opWithException();

    }

    catch (jacorb.demo.grid.MyServerPackage.MyException ex)

    {

    System.out.println("MyException, reason: " + ex.why);

    }

    }

    catch (Exception e)

    {

    e.printStackTrace();

    }

    }

    }

    JACORB的調用方式分為 2種方式

    (一)IOR定位調用方式

     首先我們展示的是IOR定位調用方式,需要server把生成的IOR文件交給client

      首先運行server 把生成的ior文件保存到一個文件中:

    jaco demo.grid.Server d://test/NS_Ref

    打開d://test/NS_Ref可以看到如下內容:

    IOR:000000000000001B49444C3A64656D6F2F677269642F4D795365727665723A312E300000000000020000000000000070000102000000000E6C6F6F636B7977616E672D30310012980000001C5374616E64617264496D706C4E616D652F00151F2C4C294C3C011139000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C0000000000000001000000010000001C00000000000100010000000105010001000101090000000105010001

     

     

    其實這個內容我們可以用JACORB提供command可以反解析的

    Dior –f d://test/NS_Ref

     

    ------IOR components-----

    TypeId  :       IDL:demo/grid/MyServer:1.0

    TAG_INTERNET_IOP Profiles:

            Profile Id:     IIOP Version :  1.2

            Host    :       loockywang-01

            Port    :       4760

            Object key (URL):      StandardImplName/%00%15%1F,L)L%3C%01%119

            Object key (hex):    0x53 74 61 6E 64 61 72 64 49 6D 70 6C 4E 61 6D 65 2

    F 00 15 1F 2C 4C 29 4C 3C 01 11 39

            -- Found 2 Tagged Components--

            #0: TAG_ORB_TYPE

                    Type: 1245790976 (JacORB)

            #1: TAG_CODE_SETS

                    ForChar native code set Id: ISO 8859-1

                    Char Conversion Code Sets: UTF-8

                    ForWChar native code set Id: UTF-16

                    WChar Conversion Code Sets: UTF-8

     

    Components in MULTIPLE_COMPONENTS profile: 1

            #0: TAG_CODE_SETS

                    ForChar native code set Id: ISO 8859-1

                    Char Conversion Code Sets: UTF-8

                    ForWChar native code set Id: UTF-16

                    WChar Conversion Code Sets: UTF-8

     

     

    從這段內容里面我們可以看到HOST PORT等信息也就是說client有辦法定位到server的位置以及服務了

     IOR的內容 作為參數來運行 client程序

    C:\Documents and Settings\jpwang>jaco demo.grid.Client IOR:000000000000001B49444

    C3A64656D6F2F677269642F4D795365727665723A312E300000000000020000000000000070000102000000000E6C6F6F636B7977616E672D303100135C0000001B5374616E64617264496D706C4E616D652F00151F2D0C241517473600000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C00000

    00000000001000000010000001C00000000000100010000000105010001000101090000000105010001

    得到如下運行結果

    Height = 31

    Width = 14

    Old value at (30,13): 0.21

    Setting (30,13) to 470.11

    New value at (30,13): 470.11

    MyException, reason: This is only a test exception, no harm done :-)

    done.

     

     

     

     

    (二)Naming Service的調用方式

     

    1:啟動ns

    Naming service的調用一定要啟動naming server,在這里JACORB提供一個command ns

     

    只要配置文件寫的都對,只需要啟動NS就可以了

     

    >ns 回車

     

    2:啟動server

    jaco demo.grid.Server

    3:監控你的namingserver 通過命令nmg

    或者通過命令lsns 得到如下結果.

    C:\Documents and Settings\jpwang>lsns

    [ configuration jacorb loaded from file D:\work\nj\JACORB\etc\jacorb.properties

    ]

       grid.example

     

     

    4:運行client

    C:\Documents and Settings\jpwang>jaco demo.grid.Client

    得到如下結果

    Height = 31

    Width = 14

    Old value at (30,13): 0.21

    Setting (30,13) to 470.11

    New value at (30,13): 470.11

    MyException, reason: This is only a test exception, no harm done :-)

    done.

     

    posted on 2007-11-22 10:41 小小程序程序員混口飯吃 閱讀(8315) 評論(2)  編輯  收藏 所屬分類: java

    評論:
    # re: 用JACORB開發corba應用 2008-03-25 21:22 | hongguoyuan
    使用jacorb運行它自帶的小例子grid,出現如下錯誤。敢問樓主知道如何解決否?不勝感謝!!



    [ configuration jacorb loaded from file F:\workspace\jaco2\etc\jacorb.properties ]
    int orb ok!
    [jacorb.orb] INFO :
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    JacORB V 2.2, www.jacorb.org
    (C) Gerald Brose, XTRADYNE Technologies/FU Berlin, 7-May-2004
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    [jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1 IORIs
    [jacorb.poa] INFO : oid:
    00 15 2B 2D 40 0A 29 2E 01 41 11 ..+-@.)..A.
    object is activated
    [jacorb.orb.giop] INFO : ClientConnectionManager: created new conn to target 202.112.157.79:10021
    [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
    [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
    [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
    [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
    [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
    org.omg.CORBA.TRANSIENT: Retries exceeded, couldn't reconnect to 202.112.157.79:10021 vmcid: 0x0 minor code: 0 completed: No
    at org.jacorb.orb.iiop.ClientIIOPConnection.connect(Unknown Source)
    at org.jacorb.orb.giop.GIOPConnection.write(Unknown Source)
    at org.jacorb.orb.CDROutputStream.write(Unknown Source)
    at org.jacorb.orb.giop.ServiceContextTransportingOutputStream.write_to(Unknown Source)
    at org.jacorb.orb.giop.GIOPConnection.sendMessage(Unknown Source)
    at org.jacorb.orb.giop.GIOPConnection.sendRequest(Unknown Source)
    at org.jacorb.orb.giop.ClientConnection.sendRequest(Unknown Source)
    at org.jacorb.orb.giop.ClientConnection.sendRequest(Unknown Source)
    at org.jacorb.orb.Delegate.invoke_internal(Unknown Source)
    at org.jacorb.orb.Delegate.invoke(Unknown Source)
    at org.jacorb.orb.Delegate.is_a(Unknown Source)
    at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)
    at org.omg.CosNaming.NamingContextExtHelper.narrow(NamingContextExtHelper.java:73)
    at demo.grid.SimpleServer.main(SimpleServer.java:48)

      回復  更多評論
      
    # re: 用JACORB開發corba應用[未登錄] 2014-07-30 16:01 | jayden
    請問下這個怎么做動態調用,能不能做?如果這樣的例子求一個307106941@qq.com  回復  更多評論
      
    主站蜘蛛池模板: 亚洲精品视频免费在线观看| 亚洲日本国产综合高清| 无码精品人妻一区二区三区免费看| 亚洲色图.com| 国产精品福利在线观看免费不卡| 亚洲第一福利网站| 久久久久国色av免费看| 亚洲色大情网站www| 亚洲色无码一区二区三区| 中文字幕乱码免费视频| 一区二区三区免费在线视频 | 免费H网站在线观看的| 小说区亚洲自拍另类| 久久久无码精品亚洲日韩蜜桃| 成年大片免费视频| 三年片在线观看免费西瓜视频| 亚洲制服丝袜中文字幕| a级毛片无码免费真人| 国产精品亚洲AV三区| 亚洲国产精品无码一线岛国| 四虎成人免费网站在线| 美女视频黄的免费视频网页 | 污污的视频在线免费观看| 亚洲人成电影在在线观看网色| 四虎永久在线精品免费影视| 无忧传媒视频免费观看入口| 亚洲婷婷在线视频| 四虎1515hm免费国产| 免费福利视频导航| 免费看男人j放进女人j免费看| 美国毛片亚洲社区在线观看| 亚洲综合激情视频| 亚洲人成在线播放网站| 亚洲Av无码乱码在线播放| 国产精品美女午夜爽爽爽免费| 国产精品免费高清在线观看| rh男男车车的车车免费网站| 男人的天堂av亚洲一区2区| 亚洲人成精品久久久久| 免费国产在线观看| 99热在线免费播放|