ACE+TAO 开源编程笔记/创建客户端
外观
因此,与服务器不同,客户端不需要实现任何由 IDL 生成的代码。在客户端,我们只需实例化工厂的副本(使用在服务器中生成的 IOR 字符串作为地址)并调用其函数。对于基本客户端,这就是全部内容。
在下面的代码中,程序的第一个参数用作 TAO 的 orb 的地址参数,以找到我们的服务器。我们使用之前生成的字符串,就像有人使用 IP 地址/端口组合来查找互联网上的主机和应用程序一样。虽然我们会在后面讨论,但这个类比有些贴切,因为在互联网上,我们通常更喜欢使用主机名(使用 DNS)和众所周知的服务(端口)来访问我们的服务。在 CORBA 环境中,也是如此,我们将在后面讨论。
从 orb 获取工厂对象后,我们将通用对象向下转换为由 IDL 生成的 My_Factory_var 对象。请注意,我们不是将其向下转换为“My_Factory”,而是转换为“My_Factory_var”。TAO,以及可能还有 CORBA,似乎采用了使用 XXX(如您的 IDL 中定义)作为用于操作 ORB 的类的标准,以及 XXX_var(由 IDL 生成)作为由 XXX 生成的对象的存储库。
现在,您已经从接收到的通用 ORB 对象生成了特定于应用程序的工厂对象,您可以像使用任何普通 C++ 对象一样使用这两个对象。只需记住,要牢记从查询返回的数据类型,或者您发送的数据类型。不用说,如果忽视这些细节会导致内存泄漏。
最后,销毁 ORB。虽然这是一个非常简单的应用程序,在技术上不需要析构函数,但养成这种习惯仍然是一个好主意,因为让这些对象悬空会导致分布式程序出现各种问题。
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
#include "ace_serviceI.h"
#include "ace_serviceC.h"
using namespace std;
using namespace CORBA;
int main(int argc, char *argv[])
{
// initialize the ORB
ORB_var orb = ORB_init (argc, argv, "whatever");
// There must be at least two arguments, the first is the factory
// name, the rest are the names of the stock symbols we want to
// get quotes for.
if (argc < 3) {
cerr << "Usage: " << argv[0]
<< " Factory_IOR symbol symbol..." << endl;
return 1;
}
// Bring in the IOR
Object_var factory_object = orb->string_to_object (argv[1]);
// Now downcast the object reference
My_Factory_var factory =
My_Factory::_narrow (factory_object.in ());
// Now get the full name and price of the other arguments:
for (int i = 2; i != argc; ++i) {
// Get the stock object
Widget_var widget =
factory->get_widget (argv[i]);
// Get its name, put it on a _var so it is automatically
// released!
String_var full_name = widget->full_name ();
// Now get the price
Double price = widget->price ();
cout << "The price of a widget in \""
<< full_name.in () << "\" is $"
<< price << endl;
}
// Destroy the ORB
orb->destroy ();
return EXIT_SUCCESS;
}
// Forward declare interface Widget; interface My_Factory { // = TITLE // A factory class for the widget interfaces // // = DESCRIPTION // Return the Widget interfaces based on their names // Widget get_widget (in string widget_name); }; interface Widget { // = TITLE // A simple interface to query the name and price of a widget // // = DESCRIPTION // Return the price and name of a single widget // readonly attribute string full_name; // Get the name. double price (); // Get the price };