CORBA与Java结合,小试一把

步骤一,创建一个IDL文件,此处命名为:firstcorba.idl
内容如下:
    module cn{
       interface Test{
           string getName();
       };
   };
注意:此处module相当于java中的包结构,表示该IDL文件编译后放置在cn文件夹下,大括号后面的“;”必不可少。切记!!

步骤二,IDL文件编译生成7个java类文件(这个数字不是死的,只是我用的版本生成7个,在这儿不能误导大家,呵呵),分别如下:
    _TestStub.java类是客户端的stub类,为客户端提供CORBA服务功能,它实现了客户端的Test.java接口;
   Test.java类是IDL接口的Java语言实现;
   TestHelper.java类提供很多辅助功能的方法,主要是narrow(),它为CORBA对象引用转化为适合的类型;
   TestHolder.java提供了有关参数操作的实现,这些参数在CORBA中使用但Java语言中没有直接的对应;
   TestOperations.java类是我们所预想的接口,只包含我们定义的那个方法,不包含CORBA的任何东西;
   TestPOA.java类是服务器端的skeleton类,提供了服务器端基本的CORBA功能;
   TestPOATie.java类继承了TestPOA类。

步骤三,写服务器类(TestServer.java)
package cn;

import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.POA;

class TestObject extends TestPOA {
    private ORB orb;
    public void setOrb(ORB orb){
this.orb = orb;
    }
    public String getName() {
return "test is successfull";
    }
}
public class TestServer {
    public static void main(String[] args) {
        try {
             //创建和初始化ORB
    ORB orb = ORB.init(args, null);
    // 创建服务对象并将其向 ORB 注册
    POA rootpoa = (POA)orb.resolve_initial_references("RootPOA");
    rootpoa.the_POAManager().activate();
    TestObject testRef = new TestObject();
    testRef.setOrb(orb);
    org.omg.CORBA.Object ref = rootpoa.servant_to_reference(testRef);
    Test sref = TestHelper.narrow(ref);
    // 获取根命名上下文
    org.omg.CORBA.Object objRef = orb .resolve_initial_references("NameService");
    NamingContext ncRef = NamingContextHelper.narrow(objRef);
    // 绑定命名中的对象引用
    NameComponent nc = new NameComponent("About", "");
    NameComponent path[] = { nc };
    ncRef.rebind(path, sref);
    // 等待来自客户机的调用
    java.lang.Object sync = new java.lang.Object();
    synchronized (sync) {
sync.wait();
    }
} catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
    }
}

步骤四,写客户端类(TestClient.java)
package cn;

import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class TestClient{
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("cn","");
NameComponent path[] = {nc};
Test testRef = TestHelper.narrow(ncRef.resolve(path));
String test = testRef.getName();
System.out.println(test);

}catch(Exception e){
System.out.println("ERROR:"+e);
e.printStackTrace();
}
}

}

步骤五,构建和运行
将以上的类都进行编译,放在您想放置的文件夹,这里我所有编译成的类文件都放在:classes文件夹下面。
    启动一个MS-DOS命令解释器,输入以下命令,确保命名服务器处于运行状态:
    tnameserv -ORBInitialPort 1050
   启动另一个MS-Dos命令解释器,到classes路径下,输入以下命令,启动Test服务器:
    java cn.TestServer -ORBInitialPort 1050
   再启动一个MS-Dos命令解释器,同样到classes路径下,输入以下命令,运行应用程序客户端:
    java cn.TestClient -ORBInitialPort 1050

DOS窗口出现“test is successfull”,表明成功了!!

个人认为,CORBA给每个类命名应该是依据类的全路径吧,这个有待考证,哈哈!

你可能感兴趣的:(java,应用服务器,dos)