ICE是一个非常优秀的网络通信的中间件,我们现在要利用ICE创建点对点通信和发布/订阅模式的通信。
发布订阅模式
点对点模式
一.点对点通信主要是采用RPC通信方式
1.创建一个ice文件,然后同过slice.exe编译出.h和.cpp文件
module POne {
interface PrinterOne {
void printString(string s);
int add(int num1,int num2);
int sub(int num1,int num2);
};
};
生成.h和.cpp文件
slice.exe PrinterOne.ice
PrinterOne.h 和 PrinterOne.cpp:这两个文件是服务端和客户端都需要的。
2.编写服务端的步骤:
- 初始化Ice::Communicator,使用函数createObjectAdapterWithEndpoints创建一个适配器adapter并且命名为SimplePrinterAdapter,用来监听TCP/IP端口10000传来的请求;
- 编写类PrinterOneI继承自PrinterOne并且实现里面的纯虚函数,在这个端点上创建一个PinterOneI服务,该对象提供PrinterOne的服务;
- 把PrinterOneI对象add添加到adapter上,并且标识为SimplerPrinter;如果有多个不同的PrinterOne对象,需要给他们取不同的名字来区分;
- 使用active激活adapter,当客户端有请求PrinterOne的服务时,adapter就会把请求转给PrinterOne请求;
- 最后使用waitForShutdown阻塞主线程,直到服务端运行时关闭
3.编写客户端的步骤
- 初始化Ice::Communicator,使用字符串创建一个代理stringToProxy,字符串中包含代理名称和通讯协议TCP/IP和端口(需要和服务端的保持一致);
- 使用stringToProxy返回一个Ice::ObjectPrx对象,使用PrinterOnePrx::checkedCast转换成PrinterOne对象。这个函数checkedCast会向服务端发送一个消息,“服务端是否有这样一个PrinterOne对象的代理”,如果成功则转换成PrinterOne对象,如果没有则返回一个空的对象
- 现在就可以使用PrinterOne对象的方法printString、add、sub,调用会通过代理向服务端发送请求进行通信。
二、发布/订阅模式的通信。
1.需要启动IceStorm服务,启动IceStorm需要使用iceBox来启动,需要编写两个文件config.icebox和config.service
config.icebox
IceBox.Service.IceStormDemo=IceStormService,37:createIceStorm --Ice.Config=config.service
config.sevice
# The IceStorm service instance name.
IceStormDemo.InstanceName=TestTopic
# This property defines the endpoints on which the IceStorm
# TopicManager listens.
IceStormDemo.TopicManager.Endpoints=tcp -h 10.0.1.113 -p 9999
IceStormDemo.Publish.Endpoints=tcp -h 10.0.1.113 -p 11000
Freeze.DbEnv.IceStormDemo.DbHome=db
2.在icebox.exe所在的目录创建空文件夹iceStormDemo
3.使用命令行 icebox --Ice.Config=config.icebox 启动IceStorm服务即可
4.编写ice文件
module TOne
{
interface TopicOne
{
void printString(string s);
};
};
编译成TopicOne.h和TopicOne.cpp文件
5.编写发布者
- 通过stringToProxy(“IceStorm/TopicManager:tcp -p 9999”)获取TopicManager代理,对于发布者和订阅者来说这是一个主要的IceStorm对象;
- 通过topicManager->retrieve(“TopicOne”)获取TopicOne主题,如果没有在直接创建topicManager->create(“TopicOne”)这个Topic主题;
- 获取主题TopicOne的发布者对象代理,然后通过Ice::uncheckedCast获取主题的接口
- 通过接口发布消息和订阅者通信.
6.编写订阅者
- 通过stringToProxy(“IceStorm/TopicManager:tcp -p 9999”)获取TopicManager代理;
- 编写子类TopicOneI继承自TopicOne,创建一个Adapter通过函数addWithUUID用来承载我们的TopicOneI服务;
- 通过Adapter激活activate()这个服务TopicOneI;
- 获取主题TopicOne并且使用TopicOneI服务订阅主题TopicOne;
- 处理客户端发来的信息,直到技术位置。
aaa