• 二 示例程序一


    示例程序一
    1)
    ICE文件 Printer.ice
    module demo
    {
        interface Printer
        {
            void printString(string s);
        };
    };
    2)
    Server端开发
    选择Win32控制台空白项目 添加Iced.lib IceUtild.lib
    增加Server.cpp,内容:
    #include "Printer.h"
    #include <Ice/Application.h>
    #include <Ice/Ice.h>
    using namespace std;
    using namespace demo;
    class PrinterI : public Printer 
    {
        public:
        // 重载实现接口逻辑
        virtual void printString(const string& s,const Ice::Current&);
    };
    void PrinterI::printString(const string& s, const Ice::Current&)
    {
        cout << s << endl;
    }
    int  main(int argc, char* argv[])
    {
        int status = 0;
        Ice::CommunicatorPtr ic;    // ICE运行环境句柄
     
        try 
        {
            // 调用Ice::initialize,初始化Ice run time
    // initialize 调用返回的是一个智能指针,指向一个Ice::Communicator对象,这个指针是Ice run time 的主句柄
                    ic = Ice::initialize(argc, argv);
    // 调用Communicator 实例上的createObjectAdapterWithEndpoints,创建一个对象适配器。
    // 是"SimplePrinterAdapter" (适配器的名字)
    // "default -p 10000",后者是要适配器用缺省协议(TCP/IP)在端10000 处侦听到来的请求。
                    Ice::ObjectAdapterPtr adapter= ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
    // 我们实例化一个PrinterI 对象,为我们的Printer 接口创建一个servant。
                    Ice::ObjectPtr object = new PrinterI;
    // 调用适配器的add,告诉它有了一个新的servant ;传给add 的参数是我们刚才实例化的servant,再加上一个标识符。
    // 在这里,"SimplePrinter" 串是servant 的名字
                    adapter->add(object,ic->stringToIdentity("SimplePrinter"));
                    // 如果您按网上盛传的文章写成adapter->add(object,ICE::stringToIdentity("SimplePrinter"));您就死翘翘了
                    // 就这个问题缠了我3天,后来发现官方文档是ic->stringToIdentity("SimplePrinter"),总算解围了,否则还得死绕

     

    // 调用适配器的activate 方法激活适配器
    // (适配器一开始是在扣留(holding)状态创建的;这种做法在下面这样的情况下很有用:
    // 我们有多个servant,它们共享同一个适配器,而在所有servant实例化之前我们不想处理请求)。
    // 一旦适配器被激活,服务器就会开始处理来自客户的请求。
                    adapter->activate();

     

    // 调用waitForShutdown。这个方法挂起发出调用的线程,直到服务器实现终止为止
                    ic->waitForShutdown();
        } 
    catch (const Ice::Exception& e) 
        {
            cerr << e << endl;
            status = 1;
        } 
        catch (const char* msg) 
        {
            cerr << msg << endl;
            status = 1;
        }
        if (ic) 
        {
            try 
            {
                ic->destroy();
            } 
            catch (const Ice::Exception& e) 
            {
                cerr << e << endl;
                status = 1;
            }
        }
        return status;
    }
    3)
    Client端开发
    选择Win32控制台空白项目 添加Iced.lib IceUtild.lib
    增加Client.cpp,内容:
    #include <Ice/Ice.h>
    #include "Printer.h"
    using namespace std;
    using namespace demo;
    int main(int argc, char * argv[])
    {
        int status = 0;
        Ice::CommunicatorPtr ic;
     
        try 
        {
            // 调用Ice::initialize 初始化Ice runtime。
                    ic = Ice::initialize(argc, argv);
    // 调用通信器的stringToProxy创建一个代理,所用参数是"SimplePrinter:default -p 10000"。
    // 注意,这个串包含的是对象标识和服务器所用的端口号
                    Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
    // stringToProxy 返回的代理的类型是Ice::ObjectPrx,这种类型位于接口和类的继承树的根部。
    // 但要实际与我们的打印机交谈,我们需要的是Printer 接口、而不是Object 接口的代理。
    // 为此,我们需要调用PrinterPrx::checkedCast 进行向下转换。这个方法会发送一条消息给服务器,
    // 实际询问“这是Printer 接口的代理吗?”如果是,这个调用就会返回Printer 的一个代理;
    // 如果代理代表的是其他类型的接口,这个调用就会返回一个空代理。
                    PrinterPrx printer = PrinterPrx::checkedCast(base);
    // 测试向下转换是否成功,如果不成功,就抛出出错消息,终止客户。
                    if (!printer) throw "Invalid proxy";
    // 调用代理的printString 方法,把"Hello World!" 串传给它。
    // 服务器会在它的终端上打印这个串。
                    printer->printString("Hello World!");
        } 
    catch (const Ice::Exception & ex) 
        {
            cerr << ex << endl;
            status = 1;
        } 
    catch (const char * msg) 
        {
            cerr << msg << endl;
            status = 1;
        }
     
        if (ic) 
        {
            try 
            {
                ic->destroy();
            } 
            catch (const Ice::Exception& e) 
            {
                cerr << e << endl;
                status = 1;
            }
        }
        return status;
    }
  • 相关阅读:
    Codeforces Round #420 (Div. 2) A-E
    Codeforces Round #419 (Div. 2) A-E
    Bzoj4423 [AMPPZ2013]Bytehattan
    51nod1471 小S的兴趣
    Bzoj2629 binomial
    51nod1056 最长等差数列 V2
    51nod1055 最长等差数列
    51nod1110 距离之和最小 V3
    20. 有效的括号
    155.最小栈
  • 原文地址:https://www.cnblogs.com/lidabo/p/3259710.html
Copyright © 2020-2023  润新知