CORBA与Java结合,小试一把

  • Post author:
  • Post category: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给每个类命名应该是依据类的全路径吧,这个有待考证,哈哈!