二 示例程序一

简介: 示例程序一 1) ICE文件 Printer.ice module demo {     interface Printer     {         void printString(string s);     }; }; 2) Server端开发 选择Win32控制台空白项目 添加Iced.
示例程序一
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;
}
目录
相关文章
|
C++
C++分文件编写:拆类(.h和.cpp文件)
C++分文件编写:拆类(.h和.cpp文件)
138 0
简单实例-对比文件
简单实例-对比文件
|
C++
VS下源文件中有多个代码时如何指定运行特定的代码(一个源文件下有多个代码时运行指定代码)
VS下源文件中有多个代码时如何指定运行特定的代码(一个源文件下有多个代码时运行指定代码)
297 0
|
缓存 Ubuntu Linux
安装HElib并运行示例程序
安装HElib并运行示例程序
安装HElib并运行示例程序
|
存储 分布式计算 Ubuntu
示例程序WordCount的执行
示例程序WordCount的执行
第一次创建Qt程序,对里面源代码头文件解析,常用快捷键,Qt助手
第一次创建Qt程序,对里面源代码头文件解析,常用快捷键,Qt助手
第一次创建Qt程序,对里面源代码头文件解析,常用快捷键,Qt助手
|
C#
C#调用dll代码范例
C#调用dll代码范例
120 0
在ROS 中 功能包 中将类的函数定义 与 声明 分开 文件写 用main.cpp 调用 如何配置 CmakeList.txt
在ROS 中 功能包 中将类的函数定义 与 声明 分开 文件写 用main.cpp 调用 如何配置 CmakeList.txt
在ROS 中 功能包 中将类的函数定义  与 声明 分开 文件写  用main.cpp 调用  如何配置  CmakeList.txt
|
存储
Qt 5——添加资源文件方法步骤(图解)
Qt 5——添加资源文件方法步骤(图解)
1117 0
Qt 5——添加资源文件方法步骤(图解)
|
编译器 C# 图形学
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)
📢前言 🎬通过VC 生成DLL文件 🎥在VS中生成DLL文件 🏳️‍🌈第一步:新建一个dll项目 🏳️‍🌈第二步:新建一个`.h头文件`和`.cpp源文件` 🏳️‍🌈第三步:在`.h头文件`和`.cpp源文件`中编写代码 🏳️‍🌈第四步:生成dll和lib文件 🎥在VS中进行调用DLL文件 🚩第一步:先来新建一个项目 🚩第二步:复制firstDLLTest.dll和firstDLLTest.lib文件和上一个项目的头文件firstDLLTest.h 🚩第三步:在新项目里面添加C++代码 🚩第四步:添加头文件firstDLLTest.h和firstDLLTest.
Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)