`

ICE 属性配置相关

    博客分类:
  • ICE
 
阅读更多
在前一篇文章中,大家可能都注意到了一个细节,Ice的初始化函数initialize的输入参数正好是主函数的输入参数,也就是命令行参数(注:辅助类Ice::Application也调用了initialize函数)。
Ice的初始化函数得到命令行参数后,抽取出Ice专有参数,并把分析后的配置存入到Ice的属性表中。
假设命令行为:
MyProg.exe --myoption --Ice.Config=config\
     -x a --Ice.Trace.Network=3 -y opt file
其中MyProg.exe是我们用Ice编写的程序,当Ice::initialize返回时,Ice的两个专用参数就会被抽去,argc由原来的9变成7,argv为:
MyProg.exe
--myoption
-x
a
-y
opt
file
抽去的两个参数则存放于属性表里。属性表的类型为Ice::Properties,它的常用方法有:
std::string getProperty(const std::string& prop);
std::string getPropertyWithDefault(const std::string& prop, const std::string&);
Ice::Int getPropertyAsInt(const std::string& prop);
Ice::Int getPropertyAsIntWithDefault(const std::string& prop, Ice::Int);
取得prop属性的值

Ice::StringSeq getPropertyAsList(const ::std::string& prop);
Ice::StringSeq getPropertyAsListWithDefault(const ::std::string& prop, const ::Ice::StringSeq&);
取得prop属性的值,并返回按逗号分割成的一组值。这里的Ice::StringSeq就是std::vector<std::string>(注:集合类型可通过配置改变,默认是vector)。
比如:有命令行参数: --MyProp.Test=abc,def,aaa,sde,s 则返回
abc
def
aaa
sde
s

Ice::PropertyDict getPropertiesForPrefix(const ::std::string& prefix);
返回所有含有prefix前缀的所有属性,PropertyDict是一个std::map<std::string, std::string>类型的数据表。

void setProperty(const ::std::string& prop, const ::std::string&);
设置prop属性的值

Ice::StringSeq getCommandLineOptions();
把属性表中的所有数据转化成字符串列表

Ice::StringSeq parseCommandLineOptions(
    const std::string& prefix, const Ice::StringSeq& args);
分析命令行参数,抽取出所有prefix前缀的参数,返回剩余的命令行参数。由于main函数输入的是argc和argv,我们可以使用Ice::StringSeq argsToStringSeq(int, char*[])和void stringSeqToArgs(const StringSeq&, int&, char*[])函数在StringSeq与argc/argv之间互相转换。

Ice::StringSeq parseIceCommandLineOptions(const Ice::StringSeq&);
分析Ice专有命令行参数

void load(const std::string& file);
载入file指定的配置文件,关于配置文件后文还会讲到

Ice::PropertiesPtr clone()
返回一个属性表的拷贝
下面是获得属性表的两个常用方式:
Ice::PropertiesPtr createProperties();
生成一个全新的属性表

Ice::PropertiesPtr Ice::Communicator::getProperties();
从连接器中取得当前使用的属性表
利用属性表改进我们的程序
比如,我们前面的客户端的例子:
class MyApp: public Ice::Application{
public:
    virtual int run(int, char*[])
    {
        Ice::CommunicatorPtr ic = communicator();
        Ice::ObjectPrx base =
            ic->stringToProxy("SimplePrinter:default -p 10000");
        PrinterPrx printer =  PrinterPrx::checkedCast(base);
        if(!printer) throw "Invalid Proxy!";
        printer->printString("Hello World!");
        return 0;
    }
};
ic->stringToProxy("SimplePrinter:default -p 10000");这句把代理名、协议、端口以及主机名都固化在了程序中。有时,我们需要更大的灵活性,比如由命令行参数或配置文件指定它们,上面提到的Properties接口就可以帮我们:
class MyApp: public Ice::Application{
public:
    virtual int run(int, char*[])
    {
        Ice::CommunicatorPtr ic = communicator();
        Ice::PropertiesPtr prop = ic->getProperties();
        string s = prop->getPropertyWithDefault(
            "Ice.Printer","SimplePrinter:default -p 10000");
        Ice::ObjectPrx base = ic->stringToProxy(s);
        PrinterPrx printer =  PrinterPrx::checkedCast(base);
        if(!printer) throw "Invalid Proxy!";
        printer->printString("Hello World!");
        return 0;
    }
};
这里,代理字符串从属性表(Ice::Properties,Ice::PropertiesPtr是Ice::Properties的智能指针)中得到,我们只要改变命令行参数就可以改变这个字符串,如:
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 10000"
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
...
可能你已经猜到,如果命令行里没有指定Ice.Printer,则使用默认的"SimplePrinter:default -p 10000"
另外,上面的:
Ice::PropertiesPtr prop = ic->getProperties();
string s = prop->getPropertyWithDefault(
    "Ice.Printer","SimplePrinter:default -p 10000");
Ice::ObjectPrx base = ic->stringToProxy(s);
三条指令可以用一条指令代替:
Ice::ObjectPrx base = ic->propertyToProxy("Ice.Printer");
多写几行有时还是有用的,我们可以利用它来读取我们自定义的一些参数^_^(当然还有默认参数功能)
上面的命令行里我们取的是"Ice.Printer"属性,注意它的前缀是"Ice.",如果我们改成其它前缀,如"MyProp.",那么Ice初始化时就不认为这是Ice专用参数而不理睬它了。
我们想自定义一些属性用于“私用”的话,使用"Ice."前缀就显得不合理了,这时我们可以使用属性集的parseCommandLineOptions方法来解析指定前缀的参数:
class MyApp: public Ice::Application{
public:
    virtual int run(int argc, char*argv[])
    {
        Ice::CommunicatorPtr ic = communicator();
        Ice::PropertiesPtr prop = Ice::createProperties();
        prop->parseCommandLineOptions("MyProp",
            Ice::argsToStringSeq(argc,argv));
        string s = prop->getPropertyWithDefault(
            "MyProp.Printer","SimplePrinter:default -p 10000");
        Ice::ObjectPrx base = ic->stringToProxy(s);
        PrinterPrx printer =  PrinterPrx::checkedCast(base);
        if(!printer) throw "Invalid Proxy!";
        printer->printString("Hello World!");
        return 0;
    }
};
现在,程序可以解析MyProp.Printer属性了。
配置文件
对于少量的属性,使用命令行参数确实没什么问题,一旦自定义属性增加,使用命令行参数就显得不太合适了。
Ice允许我们把所有的属性参数写到一个文本文件里,每个参数一行,比如有:
MyProg.exe \
    --MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5" \
    --MyProp.Test="abc,def,aaa,sde,s"
我们可以生成一个文本文件,内容:
MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
MyProp.Test="abc,def,aaa,sde,s"
然后,把上面的命令行参数改成:
MyProg.exe --Ice.Config=文件名
或者使用Ice::Properties::load方法载入文件,
或者使用Ice::Properties::parseIceCommandLineOptions方法解析文本内容。
分享到:
评论

相关推荐

    zeroc ice教程 ice环境配置 Ice中文教程 C++ ICE java ICE ICE入门 ice基础教程 ice开发文档

    配置信息包括客户端和服务器端的配置,以及如何设置相应的属性来满足应用程序的需求。 总结来说,文档为开发者提供了一个全面的ICE学习指南,从ICE的基础知识到实际的编程应用,再到配置和性能优化,覆盖了ICE开发...

    ICE 的聊天demo 含有ICE的配置文档

    3. **Ice.props**:这是ICE的项目属性文件,包含编译ICE接口定义文件所需的配置信息,如编译器选项、目标平台等。在Visual Studio中,这个文件可以被用来自动配置ICE编译器的设置。 4. **ICEChat.sln**:这是一个...

    ICE 的安装及在vs2013里面的配置

    - 在“配置属性”-&gt;“C/C++”-&gt;“常规”中,将ICE的头文件路径添加到“附加包含目录”中,即`C:\Program Files (x86)\ZeroC\Ice-3.5.1\include\Ice`。 - 在“配置属性”-&gt;“链接器”-&gt;“常规”中,将ICE的库文件...

    ICE分布式程序设计中文版

    第 14 章 Ice 属性与配置 307 14.1 本章综 307 14.2 属性 307 14.3 配置文件 309 14.4 在命令行上设置属性 309 14.5 Ice.Config 属性 310 14.6 命令行解析与初始化 311 14.7 Ice.ProgramName 属性 312 14.8 在程序中...

    ICE Grid部署和ICE Java支持的总结

    对于对象的配置,`&lt;object identity="hello" type="::Demo::Hello" property="Identity"&gt;`定义了一个名为"hello"的对象,类型为`::Demo::Hello`,属性为`Identity`。客户端连接时,会尝试寻找特定标识的对象,如果...

    ICE通信Demo文档

    在配置好环境之后,可以使用ICE提供的工具将Slice文件转换为C#的接口文件。步骤如下: 1. **放置Slice文件**:确保Slice文件位于一个英文路径下,例如放置在D盘根目录。 2. **运行命令行**:打开命令提示符,切换到...

    ICE中间件教程

    - **5.1 Ice属性和配置**:介绍了如何配置ICE服务的属性。 - **5.2 C++线程和同步**:探讨了如何在C++中处理并发和同步问题。 - **5.3 Ice流接口**:介绍了ICE提供的流接口。 - **5.4 异步程序设计(AMI和AMD)**:...

    Trace32_ice

    本说明书将详细介绍 **Trace32_ice** 的基本操作、配置方法及高级功能,帮助用户快速上手并充分利用此工具进行高效开发。 #### 二、系统架构 **Trace32-ICE** 的系统架构主要由以下几个关键组件构成: 1. **SCU32...

    ICE在VC6.0下环境配置验证为正确的

    2. **设置项目属性**:在VC6.0中打开或创建一个新的项目,右键选择“属性”,在“C/C++”选项卡下,添加Boost和ICE的Include路径到“常规”下的“附加包含目录”。同样,在“链接器”选项卡的“常规”部分,添加...

    icedemo实现对象的传输与返回(java)

    // 设置request的属性... Response response = demoProxy.serve(request); // 处理response... } } ``` 这个"icedemo"示例展示了如何在Java中使用ICE框架进行对象传输。ICE提供了高效的序列化机制和强大的异常...

    Multi-ICE仿真器及超级终端

    - **功能**: Multi-ICE是ARM JTAG的配置程序,用于使ARM JTAG与目标板建立通讯连接,并能够反馈目标板上ARM处理器的相关硬件信息。它是ARM开发过程中的重要工具之一,主要用于调试和验证ARM处理器上的代码。 - **...

    Delphi ICE控件 v2.8.0(附license)

    然后,可以通过Delphi的组件面板将所需控件拖放到表单上,通过属性设置调整控件行为,通过事件处理函数编写具体业务逻辑。 总的来说,Delphi ICE控件集是Delphi开发者的重要辅助工具,它能够提供一套全面的网络应用...

    ICE系列培训三ppt

    本文将深入探讨ICE运行时、动态ICE、连接管理和Freeze Map等相关概念。 1. ICE运行时 ICE运行时是ICE的核心组件,为ICE应用提供了基础设施和服务。其中,通信器(Ice::Communicator)作为ICE运行时的主入口点,扮演...

    ICE入门指南-分布式开发

    本文档是一份简明易懂的ICE(Internet Communication Engine)入门教程,旨在帮助初学者快速掌握ICE的使用方法,包括如何设置开发环境、配置编译参数以及创建并运行基本的分布式应用程序。ICE是ZeroC公司开发的一种...

    Zeroc ICE中间件slice2java的ant脚本(v1u0_0)

    zeroc ICE(Internet Communications Engine)是一款强大的分布式中间件,它提供了高效的远程...了解并掌握如何使用这样的脚本对于进行ICE相关的Java开发是非常重要的,它可以提升开发效率并确保代码的一致性和正确性。

    ICE_JNIRegistry.dll动态库64位

    4. **使用Java的“系统属性”替代**:在某些情况下,可以避免使用JNI直接调用DLL,而是利用Java的系统属性或Java的注册表API(如`sun.misc.Registry`,但请注意这个类是非公开的,使用时有风险)来访问注册表。...

    swift-IceCream帮助您将Realm数据库与CloudKit同步

    一旦引入成功,你可以在 Realm 模型类上应用 `IceCream` 属性装饰器,如下所示: ```swift import Realm import IceCream class User: Object { @objc dynamic var name = "" @objc dynamic var age = 0 @Ice...

Global site tag (gtag.js) - Google Analytics