ACE+TAO 开源编程笔记/在命名服务器上查找服务
外观
在您的命名服务(和其他服务运行)之后,可以通过尝试以下操作来测试您的服务是否存在
tao_nslist -ORBInitRef NameService=corbaloc:iiop:localhost:12345/NameService
这应该会产生以下输出
Naming Service: ---------
您的命名服务将显示在虚线下方。
现在要真正连接这两个应用程序。为了使我们之前的示例命名服务生效,我们需要添加代码以连接到命名服务,然后,在该上下文中解析我们的服务。以下代码替换了从命令行引入 IOR 的代码,使用从命令行获取的可读 URL 解析对工厂对象的引用,该 URL 从重启到重启是持久存在的。以下是我们将应用的代码片段
#include "corbalocC.h"
#include "orbsvcs/CosNamingC.h"
#include "ace/SString.h"
ACE_TString corbaloc_url_;
CosNaming::NamingContextExt_var naming_context_;
corbaloc_url_ = argv[1];
// Get a reference to the Naming Service
CORBA::Object_var naming_context_object =
orb->string_to_object (corbaloc_url_.c_str());
// Narrow to get the correct reference
naming_context_ =
CosNaming::NamingContextExt::_narrow (naming_context_object.in ());
//Setup to get service from within the naming context
CosNaming::Name name (1);
name.length (1);
name[0].id = CORBA::string_dup ("Widgits");
// Resolve the name
CORBA::Object_var factory_object =
naming_context_->resolve (name);
// Narrow
corbaloc::Status_var factory =
corbaloc::Status::_narrow (factory_object.in ());
//And use as desired
factory-> ... do something
请注意,代码可能是完全通用的,可以放在可重用的函数中。代码中唯一两个原始部分是从命令行提取的 URL 以及表示远程类名称的字符串“Widgets”。
./client corbaloc::localhost:12345/NameService
在这个示例中,所有内容都在一个框内,但在现实中,这些服务不需要运行在相同的硬件上,它们只需要通过指定的端口可访问即可。现在,让我们看一下客户端代码。