如果想开发一个CORBA的Helloworld,基本上有以下几个步骤:
1.使用idl语言开发idl文件,这个文件中描述了接口的定义
module:对应了java中的package
interface:对应了java中的interface,HelloWorld即接口名称
sayHello:对应了java中interface声明的方法
string:对应了java中方法的返回值
2.使用java中的idlj命令,将idl语言翻译成java语言,并生成java代码
idlj -fall m.idl
idlj:java自带的工具
-fall:生成server和client端代码,也可以单独生成server或client
下面包含了6个java源文件,分述如下:
HelloPOA POA指的是Portable Object Adapter(轻便对象适配器)。这个抽象类是一个基于流的服务器端骨架,提供了服务器端基本的CORBA功能。
_HelloSutb 客户端的存根类,为客户端提供了CORBA功能。
Hello 这是java版的Hello接口,它提供了标准的CORBA对象功能。
HelloHelper 这是一个辅助类,负责向CORBA流中写入或读取对象。
HelloHolder 这是一个final类,它持有一个public的Hello实例变量。它用来操作CORBA输入输出流的参数。
HelloOperations 这个类才是我们所预想的那个接口,只包含我们定义的那个方法,不包含CORBA的任何东西。
3、开发server端的代码
实现是在server端的,需要继承自的HelloWorldPOA
copy六个存根文件到Server项目中
1)接口实现类
package server;
import helloworld.HelloWorldPOA;
/**
* 服务器端的实现代码
*
*/
public class HelloWorldImpl extends HelloWorldPOA {
@Override
public String sayHello() {
return "Hello World!12333"; //服务器端的实现代码
}
}
2)服务类
package server;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import helloworld.HelloWorld;
import helloworld.HelloWorldHelper;
public class HelloServer {
public static void main(String[] args) throws ServantNotActive, WrongPolicy, InvalidName, AdapterInactive, org.omg.CosNaming.NamingContextPackage.InvalidName, NotFound, CannotProceed {
//指定ORB的端口号 -ORBInitialPort 1050
args = new String[2];
args[0] = "-ORBInitialPort";
args[1] = "1050";
//创建一个ORB实例
ORB orb = ORB.init(args, null);
//拿到RootPOA的引用,并激活POAManager,相当于启动了server
org.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");
POA rootpoa = POAHelper.narrow(obj);
rootpoa.the_POAManager().activate();
//创建一个HelloWorldImpl实例
HelloWorldImpl helloImpl = new HelloWorldImpl();
//从服务中得到对象的引用,并注册到服务中
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
HelloWorld href = HelloWorldHelper.narrow(ref);
//得到一个根名称的上下文
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
//在命名上下文中绑定这个对象
String name = "Hello";
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind(path, href);
//启动线程服务,等待客户端调用
orb.run();
System.out.println("server startup...");
}
}
4、开发client端的代码
server端的实现与服务监听都已经做完,现在需要写一个client来调用server的方法
copy六个存根文件到client项目中
package client;
import helloworld.HelloWorld;
import helloworld.HelloWorldHelper;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
public class HelloClient {
static HelloWorld helloWorldImpl;
static {
System.out.println("client开始连接server.......");
//初始化ip和端口号,-ORBInitialHost 127.0.0.1 -ORBInitialPort 1050
String args[] = new String[4];
args[0] = "-ORBInitialHost";
//server端的IP地址,在HelloServer中定义的
args[1] = "127.0.0.1";
args[2] = "-ORBInitialPort";
//server端的端口,在HelloServer中定义的
args[3] = "1050";
//创建一个ORB实例
ORB orb = ORB.init(args, null);
// 获取根名称上下文
org.omg.CORBA.Object objRef = null;
try {
objRef = orb.resolve_initial_references("NameService");
} catch (InvalidName e) {
e.printStackTrace();
}
NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);
String name = "Hello";
try {
//通过ORB拿到了server实例化好的实现类
helloWorldImpl = HelloWorldHelper.narrow(neRef.resolve_str(name));
} catch (NotFound e) {
e.printStackTrace();
} catch (CannotProceed e) {
e.printStackTrace();
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
e.printStackTrace();
}
System.out.println("client connected server.......");
}
public static void main(String args[]) throws Exception {
sayHello();
}
//调用实现类的方法
public static void sayHello() {
String str = helloWorldImpl.sayHello();
System.out.println(str);
}
}
5.启动orbd服务
仅仅创建了server和client的代码还不足以跑起来一个HelloWorld,还需要启动一个orbd服务,orbd包含自启动服务、透明的命名服务、持久化命名服务和命名管理器的后台处理进程。
orbd -ORBInitialPort 1050 -ORBInitialHost 127.0.0.1
6、启动server服务
7.启动client