关闭

ice环境初始化和slice方法调用

标签: applicationservicestringexceptionclass服务器
2275人阅读 评论(0) 收藏 举报
分类:
1、客户端环境调用
#include<Ice/Ice.h>
int main(int argc, char* argv[])
{
    Ice::CommunicatorPtr ic;
   try
   {
       ic = Ice::initialize(argc, argv);

       Ice::ObjectPrx base = ic->stringToProxy("MyProxy:default -p 10000");
       if (!base)
       {
           throw "Can not find proxy";
       }

        MyProxyPrx proxy = MyProxyPrx::checkCast(base);
       if (!proxy)
       {
           throw "Invalid Proxy";
       }

       proxy->op();
   }
   catch(const Ice::Exception& ex)
   {
   }
   catch(const std::string& msg)
   {
   }
   catch(const char* msg)
   {
   }

   if (ic)
   {
      ic->destory();
   }

   return 0;
}


2、服务器端环境调用
#include<Ice/Ice.h>
int main(int argc, char* argv[])
{
    Ice::CommunicatorPtr ic;
   try
   {
       ic = Ice::initialize(argc, argv);

       Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("MyAdapter", "default -p 10000");

       MyProxyPtr proxy = new MyProxyI();
       adapter->add(proxy, communicator()->stringToIdentity("MyProxy"));

       adapter->activate();

       ic->waitForShutdown();
   }
   catch(const Ice::Exception& ex)
   {
   }
   catch(const std::string& msg)
   {
   }
   catch(const char* msg)
   {
   }

   if (ic)
   {
       ic->destory();
   }

   return 0;
}


3、Application对象
class Application
{
public:
    Application(SignalPolicy = HandleSignals);

public:
    int main(int, char*[], const Ice::InitializationData& = Ice::InitializationData());
    int main(int, char*[], const char*);


public:
    virtual int run(int, char*[]) = 0;
    virtual void interruptCallback(int);


public:
    static const char* appName();
    static CommunicatorPtr communicator();
    static bool interrupted();
};
定义类,继承至Ice::Application,实现run方法,在main函数中调用Application::main()即可。需要知道Application的main方法帮你完成了如下事情
A、创建并设置了一个异常句柄,用来捕获程序运行过程中异常并打印到标准输出
B、调用Ice::initialize初始化来创建通信器,并在主循环结束后调用通信器的destory方法
C、扫描输入参数并将ICE支持的参数剥离掉后返回给run方法
D、提供appName方法获取应用名称,即argv[0],提供communicator方法获取通信器
E、创建信号处理器,用来捕获系统信号并处理
F、创建一个日志处理对象,用来输出系统日志到错误输出
在run方法的实现中,可以通过调用interrupted方法判断是否是外部信号中断了程序运行


4、Service对象
class Service
{
public:
    virtual bool shutdown();
    virtual void interrupt();

public:
    int main(int&, char*[], const InitializationData& = InitializationData());
    Ice::CommunicatorPtr communicator() const;
    static Service* instance();
    bool service() const;
    std::string name() const;
    virtual void handleInterrupt(int);

protected:
    virtual bool start(int, char*[], int&) = 0;
    virtual void waitForShutdown();
    virtual bool stop();
    virtual Ice::CommunicatorPtr initializeCommunicator(int&, char*[], const InitializationData&);

protected:
    virtual void syserror(const std::string&);
    virtual void error(const std::string&);
    virtual void warning(const std::string&);
    virtual void trace(const std::string&);
    virtual void print(const std::string&);
};
定义类,继承至Ice:Service,实现start方法,在main函数中调用Service::main()即可。需要知道Service的run方法帮你完成了如下事情:
A、创建一个信号处理对象,用来捕获系统信号并处理
B、调用initializeCommunicator方法创建ICE的通信对象,并在主循环结束后调用通信器的destory方法
C、调用start方法,如果start方法返回false则结束
D、调用waitForShutdown方法等待主循环结束,主循环可通过调用shutdown方法结束
E、调用stop方法
F、回收系统资源
Service程序运行支持如下命令行参数:--daemon、--pidfile file、--noclose、--nochdir
Service由于在--daemon启动后关闭了标准输出的描述符,因此日志不起作用,如果需要自定义日志,需要子类重新定义initializeCommunicator
方法并安装一个日志对象来记录运行日志
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:90325次
    • 积分:1187
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:3篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论