利用ICE创建发布/订阅和RPC(远程调用)

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.编写服务端的步骤:

  1. 初始化Ice::Communicator,使用函数createObjectAdapterWithEndpoints创建一个适配器adapter并且命名为SimplePrinterAdapter,用来监听TCP/IP端口10000传来的请求;
  2. 编写类PrinterOneI继承自PrinterOne并且实现里面的纯虚函数,在这个端点上创建一个PinterOneI服务,该对象提供PrinterOne的服务;
  3. 把PrinterOneI对象add添加到adapter上,并且标识为SimplerPrinter;如果有多个不同的PrinterOne对象,需要给他们取不同的名字来区分;
  4. 使用active激活adapter,当客户端有请求PrinterOne的服务时,adapter就会把请求转给PrinterOne请求;
  5. 最后使用waitForShutdown阻塞主线程,直到服务端运行时关闭

3.编写客户端的步骤

  1. 初始化Ice::Communicator,使用字符串创建一个代理stringToProxy,字符串中包含代理名称和通讯协议TCP/IP和端口(需要和服务端的保持一致);
  2. 使用stringToProxy返回一个Ice::ObjectPrx对象,使用PrinterOnePrx::checkedCast转换成PrinterOne对象。这个函数checkedCast会向服务端发送一个消息,“服务端是否有这样一个PrinterOne对象的代理”,如果成功则转换成PrinterOne对象,如果没有则返回一个空的对象
  3. 现在就可以使用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.编写发布者

  1. 通过stringToProxy(“IceStorm/TopicManager:tcp -p 9999”)获取TopicManager代理,对于发布者和订阅者来说这是一个主要的IceStorm对象;
  2. 通过topicManager->retrieve(“TopicOne”)获取TopicOne主题,如果没有在直接创建topicManager->create(“TopicOne”)这个Topic主题;
  3. 获取主题TopicOne的发布者对象代理,然后通过Ice::uncheckedCast获取主题的接口
  4. 通过接口发布消息和订阅者通信.

6.编写订阅者

  1. 通过stringToProxy(“IceStorm/TopicManager:tcp -p 9999”)获取TopicManager代理;
  2. 编写子类TopicOneI继承自TopicOne,创建一个Adapter通过函数addWithUUID用来承载我们的TopicOneI服务;
  3. 通过Adapter激活activate()这个服务TopicOneI;
  4. 获取主题TopicOne并且使用TopicOneI服务订阅主题TopicOne;
  5. 处理客户端发来的信息,直到技术位置。

源码下载

aaa

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值