您的位置:首页 > 其它

Corba开发之基于Name Service实现

2015-11-15 15:30 302 查看
在之前的文章中描述了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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: