在之前的文章中描述了Corba基于ior的实现,还有一种常用的是基于nameService实现;Corba的对象命名服务就是给对象实例提供一个名称,以便用户通过这些名称来获取对象的实例。对象命名服务是ORB上的对象找到其它对象的基本机制。名字是用来识别一个对象的可人工辨认的值,命名服务将这些名字映射到对象标记,名字-对象关联叫做名字联编。命名语言环境是一个名字空间,对象名字在这里是独一无二的。每个对象都有一个独一无二的参考标识符。可以有选择地将一个或多个名字与一个对象标记关联起来。
直接上关键代码:
1、Service服务端:
public class Server_AOM {
//server启动的代码,这段代码主要功能是将接口实现注册到ORB中,并启动监听,等待client来调用
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实例
HelloServerImpl helloImpl = new HelloServerImpl();
// 从服务中得到对象的引用,并注册到服务中
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.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);
System.out.println("server startup...");
// 启动线程服务,等待客户端调用
orb.run();
}
}
2、Client客户端:
public class HelloClient {
static Hello 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] = "172.168.xxx.xxx";
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 = HelloHelper.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);
}
}