跳转到内容

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;
}

ace_service.idl

[编辑 | 编辑源代码]
// 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

};
华夏公益教科书