ICE Service使用方法简介 (2011-09-13 20:58:24)转载标签: 杂谈
2011-11-23 16:52
701 查看
ICE Service使用方法简介
(2011-09-13 20:58:24)
转载
标签:杂谈 |
1. 平台无关性。无论客户端或者服务端均可用现在流行的开发语言(C++ /J***A/C#/php)进行开发,并且屏蔽语言差异性。现在比较流行的方式是客户端用C#开发,与用C++开发的服务端直接通讯。
2. 通讯协议多样性。现在可选择TCP、UDP、HTTP进行通讯,如果对安全要求较高,可选择SSL对传输的数据进行加密。
另外ICE还提供一些扩展组件,实现网络通讯的负载均衡(ICEGrid),通讯节点统一管理(ICEBOX),程序自动更新(ICEPatch)等,方便应用扩展。
如果使用过ICE的人都知道,在实现服务端或者客户端的时候通常都要写一些“公式化”的代码,负责Ice通信器初始化、异常捕获,以及应用终止后的销毁。如下所示:
1int status=0;
2
3 Ice::CommunicatorPtr ic;
4
5 try
6
7 {
8
9 ic = Ice::initialize(argc,argv);
10
11 Ice::ObjectAdapterPtr adapter =
12
13 ic->createObjectAdapterWithEndpoints("SayHelloAdapter","tcp -h 127.0.0.1 -p 10000");
14
15 Ice::ObjectPtr object = new HelloICEI;
16
17 adapter->add(object,ic->stringToIdentity("SimpleHello"));
18
19 adapter->activate();
20
21 ic->waitForShutdown();
22
23 }
24
25 catch (const Ice::Exception & e)
26
27 {
28
29 cerr << e << endl;
30
31 status = 1;
32
33 }
34
35 catch (const char * msg)
36
37 {
38
39 cerr << msg << endl;
40
41 status = 1;
42
43 }
44
45 if ( ic )
46
47 {
48
49 try
50
51 {
52
53 ic->destroy();//关闭ICE
54
55 }
56
57 catch (const Ice::Exception & e)
58
59 {
60
61 cerr << e << endl;
62
63 status = 1;
64
65 }
66
67}
68
69
如果每次都要写这么多的话,第一浪费时间和精力,第二不能将注意力集中到业务逻辑上。还有一点就是对代码的整洁和易读方面做的不够好(本人略微有些代码“洁癖”)。
阅读官方手册,发现ICE提供两个工具类封装了这些“公式化”逻辑,分别是“Application”和“Service”。
Ice::Application本身是一个抽象类,其run()函数为纯虚函数,因此必须被继承后使用。
Ice::Application 是一个单体(singleton)类,会创建单个通信器。如果你要使用多个通信器,不能使用Ice::Application来定义多个App。而至多定义一个App的实例。
其它通信器需要使用Ice::initialize()手工生成。
一般而言,Ice::Application 类对于Ice 客户和服务器来说已经非常方便,但在有些情况下,应用可能需要作为Unix 看守(daemon)或Win32 服务运行在系统一级。对于这样的情况,Ice 提供了Ice::Service。一个可与Ice::Application 相比的单体类,但它还封装了低级的、针对特定平台的初始化和关闭步骤――系统服务常常需要使用这样的步骤。
下面介绍Ice::Service的使用方法,仅介绍开发步骤,后面附上具体例子下载。
1. 需要在服务端中引用Ice/Service.h头文件。本人曾在此浪费了2个小时。
2. 新建一个类继承Ice::Service,并实现其中的三个虚函数。代码如下:
1class MyService : public Ice::Service
2
3{
4
5protected:
6
7virtual bool start(int, char *[],int&);
8
9virtual bool stop();
10
11virtual void interrupt();
12
13private:
14
15Ice::ObjectAdapterPtr m_adapter;
16
17};
18
19void MyService::interrupt()
20
21{
22
23std::cout << "Receive signal " << std::endl;
24
25Ice::Service::interrupt();
26
27}
28
29bool MyService::stop()
30
31{
32
33std::cout << "Stop running " << std::endl;
34
35return true;
36
37}
38
39bool MyService::start(int argc, char * argv[],int& status)
40
41{
42
43std::string endpoint = "tcp -h localhost -p 10000";
44
45m_adapter = communicator()->createObjectAdapterWi thEndpoints("SimpleHelloAdapter", endpoint);
46
47Ice::ObjectPtr object = new HelloICEI;
48
49m_adapter->add(object,communicator()->stringToIdentity("SimpleHello"));
50
51m_adapter->activate();
52
53return true;
54
55}
56
57
3. 在main函数中启动服务。此处需要注意对于服务来说最常见的有安装服务、卸载服务、启动服务、停止服务四个操作。这四个操作分别通过启动参数来控制。以Win32平台为例:
--service NAME
作为名叫NAME 的Windows 服务启动。在传给start 成员函数的参数向量中,这个选项会被移除。
但是,在应用作为Windows 服务运行之前,它必须先被安装,因此,Ice::Service 类还支持另外一些的命令行选项,用于执行管理活动:
--install NAME [--display DISP] [--executable EXEC][ARG ...]
安装NAME 服务。如果指定了--display 选项,就把DISP 用作服务的显示名,否则就使用NAME。如果指定了--executable 选项,就把EXEC 用作服务的可执行路径名,否则就使用可执行文件的路径名来调用--install。其他任何参数都会不加改变地传给Service::start 成员函数。注意,在启动时传给服务的参数集中,这个命令会自动增加命令行参数--service NAME,因此,你不需要显式地指定这些选项。
--uninstall NAME
移除NAME 服务。如果服务目前是活动的,在反安装之前,必须先使它停止。
--start NAME [ARG ...]
启动NAME 服务。其他任何参数都会不加改变地传给Service::start 成员函数。
--stop NAME
停止NAME 服务。如果指定的管理命令不止一个,或者在使用--service 的同时还使用了管理命令,就会发生错误。在执行了管理命令之后,程序会立即终止。Ice::Service 类支持Windows 服务控制代码SERVICE_CONTROL_INTERROGATE 和SERVICE_CONTROL_STOP。在收到SERVICE_CONTROL_STOP 时,Ice::Service 会调用shutdown 成员函数。
在Visual Studio中设置启动参数—install MyService,可在系统服务中注册名为“MyService”的服务。
启动服务端程序可以在系统服务列表中看到MyService已经作为服务注册进去了。
4. 至此ICE的服务端即可作为系统服务的形式存在与客户端进行通讯了。
相关文章推荐
- C# 匿名方法和拉姆达表达式 (2012-04-27 23:27:15)转载▼ 标签: 杂谈 匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法。 规则: 1、匿名方法中不能使用跳转语句跳
- 简介AngularJS中使用factory和service的方法
- sizeWithFont:constrainedToSize:lineBreakMode的使用 (2012-03-20 10:48:40)转载▼ 标签: 宽度 字符串 获取 指定 用于 杂谈 分类:
- 简介AngularJS中使用factory和service的方法
- SQLServer 存储过程简介与使用方法<转载>
- 简介AngularJS中使用factory和service的方法
- 简介AngularJS中使用factory和service的方法
- poi读取Excel时日期为数字 的解决方法 转载 2017年12月14日 10:31:14 标签:poi /excel /java 19 在使用poi解析Excel文件时,会发现,表格中的日期解析出
- IntelliJ Idea 2017 注册码 免费激活方法 转载 2017年07月16日 23:16:16 标签: intellij idea / 注册码 可使用以下两种方
- 网络神器Greasemonkey(油猴子)使用方法简介+脚本分享【转载】
- AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法
- AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法
- 简介AngularJS中使用factory和service的方法
- 简介AngularJS中使用factory和service的方法
- 【转载】[C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- Linux下GCC使用方法简介
- memcached简介及java使用方法
- 安卓四大组件之二#2-使用AIDL技术实现动态调用其他app中的Service的方法
- SQL中Case的使用方法 (转载)
- media type(媒体类型)与media query(媒体查询)简介及使用方法介绍