1.编写idl程序,主要是希望完成什么功能。
module HelloApp{ interface Hello{ string sayHello(); string sayBye(); oneway void shutdown(); }; };
进入cmd进行编译:idlj -fall HelloApp.idl,会生成HelloApp文件夹。
2.在Eclipse建立服务器端server_project。
需要下载包:http://www.jacorb.org/releases/2.3.1/jacorb-2.3.1-bin.zip
解压后需要:avalon_framework.jar,jacorb.jar,logkit.jar
第一步骤生成的程序拷贝到项目中。
a.实现功能
package com.corba; import org.omg.CORBA.ORB; import HelloApp.HelloPOA; public class HelloImpl extends HelloPOA{ private ORB orb; public void setOrb(ORB orb) { this.orb = orb; } public String sayHello() { return "Hello ganliang!"; } public void shutdown() { orb.shutdown(false); } @Override public String sayBye() { return "Bye ganliang"; } }
b.建立伺服器
package com.corba;
import java.util.Properties; import org.omg.CORBA.ORB; import org.omg.PortableServer.IdAssignmentPolicyValue; import org.omg.PortableServer.LifespanPolicyValue; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.ServantRetentionPolicyValue; public class HelloServer { //持久化的POA private static POA persistentPOA = null; public static void main(String[] args) { //生成一个对象请求代理(ORB),并初始化 Properties props = new Properties(); //使用jacorb的CORBA实现方案 props.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB"); props.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton"); //使用持久化IOR,必须指定持久化POA的实现名称,默认是"StandardImplName", //可以随便指定 props.put("jacorb.implname", "StandardImplName"); //这里是指定CORBA服务器端端口为固定端口,是CORBA的IOR固定不变的关键 props.put("OAPort", "12500"); //如果需要指定服务器端的ip地址,则需要使用下面这种方式,默认使用上面的方式//只指定端口即可,ip地址是服务器端程序所在机器的ip,注意这两种只能二选其一 props.put("OAAddress", "iiop://192.168.10.4:10501"); try{ //创建ORB实例 ORB orb = ORB.init(args, props); //得到一个 RootPOA引用 POA rootPoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); //指定创建持久化POA的策略,使用持久化POA必须指定以下三种策略 org.omg.CORBA.Policy[] policies = new org.omg.CORBA.Policy[3]; //POA生命周期是持久化 policies[0] = rootPoa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT); //CORBA对象的标识符是用户指定的 policies[1] = rootPoa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID); //每次接到一个请求时,POA期望应用程序提供目标对象标识符作为 //查找伺服程序的索引 policies[2] = rootPoa.create_servant_retention_policy(ServantRetentionPolicyValue.RETAIN); //创建持久化的POA persistentPOA = rootPoa.create_POA("PersistentPOA", rootPoa.the_POAManager(), policies); //清除策略 policies[0].destroy(); policies[1].destroy(); policies[2].destroy(); policies = null; //创建伺服程序并注册到ORB上 HelloImpl helloImpl = new HelloImpl(); helloImpl.setOrb(orb); //创建伺服程序标识符,因为使用IdAssignmentPolicyValue.USER_ID //策略,所有必须要指定伺服程序id byte[] servantId = "MyHelloImpl".getBytes(); //将伺服程序标识符和服务器端CORBA对象关联起来并激活 persistentPOA.activate_object_with_id(servantId, helloImpl); //激活POAManager rootPoa.the_POAManager().activate(); //通过持久化POA获取CORBA对象 org.omg.CORBA.Object ref = persistentPOA.servant_to_reference(helloImpl); //打印CORBA对象的IOR System.out.println("CORBA IOR is:" + orb.object_to_string(ref)); System.out.println("HelloServer ready and waiting..."); //启动线程服务,等待调用 orb.run(); }catch(Exception e){ System.out.println("HelloServer occur error:" + e); e.printStackTrace(System.out); } System.out.println("HelloServer exiting ..."); } }
运行此程序,注意生成的IOR 长串。以供客户端用。
2.在Eclipse建立客户端client_project。
同样需要第一步骤生成的文件拷贝进项目import org.omg.CORBA.ORB;
import org.omg.CORBA.ORB; import HelloApp.Hello; import HelloApp.HelloHelper; public class HelloClient { static Hello hello; public static void main(String[] args) { try { // 创建一个ORB实例 ORB orb = ORB.init(args, null); // 直接通过IOR向CORBA获取目标对象,IOR是服务器端生成的(自己实现时,第一次需要//拷贝服务器端生成的IOR),因为是固定不变的IOR,因为这里可以直接硬编码写死 hello = HelloHelper.narrow(orb.string_to_object("IOR:000000000000001749444C3A48656C6C6F4170702F48656C6C6F3A312E30000000000001000000000000005C000102000000000D3139322E3136382E31302E34000029050000002A5374616E64617264496D706C4E616D652F50657273697374656E74504F412F4D7948656C6C6F496D706C0000000000010000000000000008000000004A414300")); // 调用接口对象的方法 System.out.println("Get hello object from corba server:" + hello); System.out.println(hello.sayHello()); System.out.println(hello.sayBye()); //关闭CORBA服务 //hello.shutdown(); } catch (Exception e) { System.out.println("HelloClient occur error:" + e); e.printStackTrace(System.out); } } }
启动服务气端,运行客户端。