Corba开发之基于Name Service实现

时间:2022-11-23 12:16:56

   在之前的文章中描述了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);
}
}