ICE的语法规则
ICE的版本控制(Facet)
持久化 (Feeze)
服务装箱管理 (ICEBox)
文件分发(ICEPatch2)
发布/订阅 服务(ICEStorm)
网络拓扑负载解决方案--终极武器(ICEGrid)
提供使用安全传输入协议SSL的插件(IceSSL)
轻量级的ICE应用防火墙其解决方案(Galcier2)
二)开发流程1)一般开发过程为,先用ICE 接口描述语言写好接口。
2)使用工具将接口描述文档转成对应语言的代码,转出的代码又分为服务端与客户端代码。
工具有以下几种:
- slice2cpp(转成c++)
- slice2freeze
- slice2freezej
- slice2html(转成html)
- slice2java(转成java)
- slice2php(转成php)
- sliceprint
3)用户实现自己的需求,编写实现类。(服务端、客户端可以做成工具类)
三)文档https://doc.zeroc.com/display/Ice36/Ice+Manual
四)ICE的整体架构(1)服务器端:
服务器端通常只有一个通信器(Ice::Communicator),通信器包含了一系列的资源:
如线程池、配置属性、对象工厂、日志记录、统计对象、路由器、定位器、插件管理器、对象适配器
在通信器内,包含有一个或更多的对象适配器(Ice::ObjectAdapter),对象适配器负责提供一个或多个传输端点,并且把进入的请求分派到对应的servant(英文是职员,类似于java中的servlet)中去执行。
具体实现的部分称为servant,它们为客户端发来的调用提供服务。servant向对象适配器注册以后,由对象适配器依据客户请求调用相应方法。
(2)客户端:
客户端直接通过代理进行远程调用,就象本地调用一样简单。
通信器Ice::Communicator通信器管理着线程池、配置属性、对象工厂、日志记录、统计对象、路由器、定位器、插件管理器、对象适配器。
通信器的几个重要方法:
std::string proxyToString(const Ice::ObjectPrx&) const; (prx是proxy,代理的缩写)
Ice::ObjectPrx stringToProxy(const std::string&) const;
这两个方法可以使代理对象和字符串之间互相转换。对于proxyToString方法,你也可以使用代理对象的 ice_toString方法代替(当然,你要确保是非空的代理对象)。
Ice::ObjectPrx propertyToProxy(const std::string&) const;
这个方法根据给定名字的属性配置生成一个代理对象,如果没有对应属性,返回一个空代理。 比如有如下属性:
MyApp.Proxy = ident:tcp -p 5000
我们就可以这样得到它的代理对象:
Ice::ObjectPrx p = communicator->propertyToProxy("MyApp.Proxy");
Ice::Identity stringToIdentity(const std::string&) const;
std::string identityToString(const Ice::Identity&) const;
转换字符串到一个对象标识(这是ice自带的),对象标识的定义如下:
namespace Ice
{
struct Identity
{
std::string name;
std::string category;
};
}
当它与字符串相互转换时,对应的字符串形式是:CATEGORY/NAME(分类/对象名称)。 比如字符串“Factory/File”, Factory是category,File是name。
category部分可以为空。
Ice::ObjectAdapterPtr createObjectAdapter(const std::string&);
Ice::ObjectAdapterPtr createObjectAdapterWithEndpoints( const std::string&, const std::string&);
这两个方法创建新的对象适配器。createObjectAdapter从属性配置中取得端点信息,而 createObjectAdapterWithEndpoints则直接指定端点。
void shutdown();
关闭服务端的Ice运行时库,调用shutdown后,执行过程中的操作仍可正常完成,shutdown不会等待这些操作完成。
void waitForShutdown();
这个方法会挂起发出调用的线程直到通信器关闭为止。
void destroy();
这个方法回收通信器的相关资源,如线程、通信端点及内存资源。在离开main函数之前,必须调用destory。
bool isShutdown() const;
如果shutdown已被调用过,则返回true。
初始化通信器在建立通信器(Ice::Communicator)期间,Ice运行时会初始化一系列的对象,这些对象一直影响通信器的整个生命周期。并且在建立通信器以后,你不能改变这些对象。所以,如果你想定制这些对象,就必须在建立通信器的过程中定义。
在通信器建立期间,我们可以定义下面这些对象:
- 属性表(property)
- 日志记录器(Logger)
- 统计对象(Stats)
- 原生字符串与宽字符串转换器
- 线程通知钩子
所有上面的对象存放在InitializationData结 构中,定义为:
namespace Ice {
struct InitializationData {
PropertiesPtr properties;
LoggerPtr logger;
StatsPtr stats;
StringConverterPtr stringConverter;
WstringConverterPtr wstringConverter;
ThreadNotificationPtr threadHook;
};
}
这个结构中的所有成员都是智能指针类型,设置好这些成员以后,就可以通过通信器的初始化函数传入这些对象:
namespace Ice {
CommunicatorPtr initialize(int&, char*[],
const InitializationData& = InitializationData());
CommunicatorPtr initialize(StringSeq&,
const InitializationData& = InitializationData());
CommunicatorPtr initialize(
const InitializationData& = InitializationData());
}
我们前面使用的Ice::Application也提供了InitializationData的传入途径:
namespace Ice
{
struct Application
{
int main(int, char*[]);
int main(int, char*[], const char*);
int main(int, char*[], const Ice::InitializationData&);
int main(const StringSeq&);
int main(const StringSeq&, const char*);
int main(const StringSeq&, const Ice::InitializationData&);
...
};
}
再回头看InitializationData结构:
properties:PropertiesPtr 类型,指定了属性表(property)对象,它就是之前《Ice属性配置》一文中的主角。默认的属性表实现可以解析“Key = Value”这种形式的字符串(包括命令行参数和文件),如果愿意,你可以自己写一个属性表实现,用来解析xml、ini等等。
如果要自己实现,就得完成下面这些接口(每个方法的作用请参考《Ice属性配置》):
namespace Ice
{
class Properties : virtual public Ice::LocalObject
{
public:
virtual std::string getProperty(const std::string&) = 0;
virtual std::string getPropertyWithDefault(const std::string&,
const std::string&) = 0;
virtual Ice::Int getPropertyAsInt(const std::string&) = 0;
virtual Ice::Int getPropertyAsIntWithDefault(const std::string&,
Ice::Int) = 0;
virtual Ice::StringSeq getPropertyAsList(const std::string&) = 0;
virtual Ice::StringSeq getPropertyAsListWithDefault(const std::string&,
const Ice::StringSeq&) = 0;
virtual Ice::PropertyDict getPropertiesForPrefix(const std::string&) = 0;
virtual void setProperty(const std::string&, const std::string&) = 0;
virtual Ice::StringSeq getCommandLineOptions() = 0;
virtual Ice::StringSeq parseCommandLineOptions(const std::string&,
const Ice::StringSeq&) = 0;
virtual Ice::StringSeq parseIceCommandLineOptions(const Ice::StringSeq&) = 0;
virtual void load(const std::string&) = 0;
virtual Ice::PropertiesPtr clone() = 0;
};
};
logger: LoggerPtr类型,这是一个日志记录器接口,它可以记录Ice运行过程中产生的跟踪、警告和错误信息,默认实现是直接向cerr输出。比如作用我们 之前的Helloworld的例子,在没开服务端的情况下运行客户端,就看到在控制超台上打印了一串错误信息。
我们可以自己实现这个接口,以控制它的输出方向,它的定义为:
namespace Ice
{
class Logger : virtual public Ice::LocalObject
{
public:
virtual void print(const std::string& msg) = 0;
virtual void trace(const std::string& category,
const std::string& msg) = 0;
virtual void warning(const std::string& msg) = 0;
virtual void error(const std::string& msg) = 0;
};
}
不用说,实现它们是一件很轻松的事情^_^,比如你可以实现这个接口把信息写到一个日志文件里,或者把它写到某个日志服务器上。
stats: StatsPtr类型,当Ice发送或接收到数据时,会向Stats报告发生的字节数,这个接口更加简单:
namespace Ice
{
class Stats : virtual public Ice::LocalObject
{
public:
virtual void bytesSent(const std::string& protocol,
Ice::Int num) = 0;
virtual void bytesReceived(const std::string& protocol,
Ice::Int num) = 0;
};
}
stringConverter:BasicStringConverter 类型; wstringConverter:BasicStringConverter 类型;
这两个接口用于本地编码与UTF-8编码之间的转换,Ice系统自带了三套转换系统,默认的UnicodeWstringConverter、Linux/Unix 下使用的IconvStringConverter和Windows 下使用的WindowsStringConverter。
threadHook: ThreadNotificationPtr类型,线程通知钩子,当Ice建立一个新线程后,线程通知钩子就会首先得到“线程启动通知”,在结束线程之 前,也能得到“线程结束通知”。
下面是ThreadNotification接口的定义:
namespace Ice
{
class ThreadNotification : public IceUtil::Shared {
public:
virtual void start() = 0;
virtual void stop() = 0;
};
}
假如我们在Windows下使用了COM组件的话,就可以使用线程通知钩子在start和stop里调用 CoInitializeEx和CoUninitialize。
代码演示
修改一下Helloworld服 务器端代码,实现自定义统计对象(Stats,毕竟它最简单嘛 -_-):
#include
#include "printer.h"
using namespace std;
using namespace Demo;
struct PrinterImp : Printer{
virtual void printString(const ::std::string& s, const ::Ice::Current&)
{
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?