使用分布式计算中间件ICE到现在已经有一年多了,在这一年里里面对ICE的理解、应用比较熟悉。

使用ICE写分布式软件,确实是很方便:ICE比较稳定、可靠,调用返回速度低延迟,使用简单,学习曲线不是很陡。

总之利用ICE开发分布式软件,是一个可行的选择。

在实际的过程中,ICE客户端跟服务端的数据流动是单项的,也就是客户端获取服务端的一个代理,从而与服务端进行数据交互,如果服务端要主动给客户端数据的时候,则需要我们给服务端传去一个客户端的代理。这时客户端也是一个服务器。在ICE中客户端、服务端没有严格的限制。

在ICE中有三种提供回调的方法,以下将具体介绍这三种方法:

1:适合服务器、客户端在如下的环境。客户和服务器程序或者运行在同一个主机上,或者运行在没有网络限制的多个主机上。这样的环境下,提供回调是最简单的。

以下是简单的例子,首先先写slice文件:

// **********************************************************************

//

// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.

//

// This copy of Ice is licensed to you under the terms described in the

// ICE_LICENSE file included in this distribution.

//

// **********************************************************************

#ifndef CALLBACK_ICE

#define CALLBACK_ICE

module Demo

{

interface CallbackReceiver

{

    void callback();

};

interface CallbackSender

{

    void initiateCallback(CallbackReceiver* proxy);

    void shutdown();

};

};

#endif

这个例子直接从ICE提供的demo中获得的。

然后利用ICE提供的slice2cpp程序,生成骨架代码,具体就不说了。

接着客服端实现利用如下的方式,提供回调代理:

CallbackSenderPrx senderPrx =

CallbackSenderPrx::checkedCast( communicator()->propertyToProxy("Callback.CallbackServer"))

"Callback.CallbackServer"是通过配置文件配置的,该代码是利用继承Ice::Application,重载它的main成员函数。communicator是ICE提供的通信器。

以下,是客户端提供回调的形式化代码:

Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Callback.Client");

adapter->add(new CallbackReceiverI, communicator()->stringToIdentity("callbackReceiver"));

adapter->activate();

CallbackReceiverPrx twowayR = CallbackReceiverPrx::uncheckedCast(

 adapter->createProxy(communicator()->stringToIdentity("callbackReceiver")));

然后调用:

senderPrx ->initiateCallback(twowayR);

这样就把客户端的一个回调代理传给服务端。

不过这样的传回调在比较负责的网络环境下,回调是会失败的。在实际的开发过程中,我就遇到这样的问题。然后去文档中寻求,解决方法。

我遇到的问题,在文档中Glacier有介绍,客户端和服务端的网络环境如图:

在这样的情况下,ICE回调给客户端是失败的,原因是ICE通过那个回调对象,不能找到客户端的路由信息。

因此有两种可选的方式,一种是利用Glacier,另外一种Bidirectional Connections(可能是要ICE3.2.0及其以后的版本才支持)。

我在实际的过程中,是利用Bidirectional Connections解决了上面的那个问题,是通过了实际的测试。Glacier方法,我没实际测试过。

因此,具体介绍Bidirectional Connections方法。在ICE文档3.2.1中提到,如何使用这个方法,大家有兴趣可以去看看。

下面提供一些形式化的代码,并说明注意事项。

还是先把slice文件(来自ICE DEMO)提供出来,以下是slice文件:

// **********************************************************************

//

// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.

//

// This copy of Ice is licensed to you under the terms described in the

// ICE_LICENSE file included in this distribution.

//

// **********************************************************************

#ifndef CALLBACK_ICE

#define CALLBACK_ICE

#include <Ice/Identity.ice>

module Demo

{

interface CallbackReceiver

{

    void callback(int num);

};

interface CallbackSender

{

    void addClient(Ice::Identity ident);

};

};

#endif

客户端的形式化代码:

CallbackSenderPrx server = 

        CallbackSenderPrx::checkedCast(communicator()->propertyToProxy

("Callback.Client.CallbackServer"));

Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("");

    Ice::Identity ident;

    ident.name = IceUtil::generateUUID();

    ident.category = "";

    adapter->add(new CallbackReceiverI, ident);

    adapter->activate();

    server->ice_getConnection()->setAdapter(adapter);

    server->addClient(ident);

服务端的形式化代码:

CallbackReceiverPrx client = CallbackReceiverPrx::uncheckedCast(current.con->createProxy(ident));

使用这个方式的一个注意事项:

1:在配置文件

#

# ACM must be disabled for bidirectional connections

#

Ice.ACM.Client=0

要将Ice.ACM.Client属性禁用掉。如果回调对象被关闭的话,只能重新

if(server->ice_getConnection()->getAdapter() == NULL)

server->ice_getConnection()->setAdapter(adapter);

    server->addClient(ident);

因为ICE有一个机制如果在一定的时间内,没有发生数据交互,连接会被关闭

其实也可以利用一个hook线程对回调代理进行ice_ping()。

2:利用Bidirectional Connections,这样的代理是在原来的连接基础上建立起来的。因此不能修改回调代理的安全、超时等属性。

ICE 的回调的更多相关文章

  1. ZeroC Ice 暂记

    摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...

  2. CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)

    http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...

  3. ICE系列之2——ICE的服务与好处

    ice服务: IcePack         我们在第 12 页提到过, IcePack 是 Ice 的定位服务,用于在使用间接绑定时把符号性的 (symbolic)适配器名解析为协议-地址对. 除了 ...

  4. ICE中间件说明文档

    ICE中间件说明文档 1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         ...

  5. ICE学习——异步1

    ICE的AMI和AMD: AMI:指的是客户端的调用.一般有一个代理类,一个回调类. 从服务端返回的数据在回调类中的ice_response函数中. AMD:指的是服务端对客户端的调用分派.一般进行业 ...

  6. 中文翻译:pjsip文档(四)之ICE Session的使用方法

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  7. 中文翻译:pjsip教程(三)之ICE stream transport的使用

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  8. ICE 介绍及实现

    .ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够 ...

  9. Ice笔记-利用Ice::Application类简化Ice应用

    Ice笔记-利用Ice::Application类简化Ice应用 作者:ydogg,转载请申明. 在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信 ...

随机推荐

  1. Python进阶(3)_进程与线程中的lock(线程中互斥锁、递归锁、信号量、Event对象、队列queue)

    1.同步锁 (Lock) 当全局资源(counter)被抢占的情况,问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为“线程不安全”.在开发过 ...

  2. matlab 读取nc

    在这里做个记录,这几个是matlab用来读取.nc格式数据的函数.只是函数,参数和变量为了便于理解,取括号中的名字.   fid=netcdf.open('fname','nowriter');%打开 ...

  3. Java系列之EJB 理解

    EJB = Enterprise Java Bean,它和JavaBean有本质的区别,最好不要将他们混淆起来,就像不要将Java和 Javascript混淆起来一样.EJB有3中类型:Session ...

  4. 【鸟哥的Linux私房菜】笔记2

    Linux的应用 学习资源整理 安装记录 >< 1.Linux的应用: 网络服务器 数据库 学术机构的高效运算任务 嵌入式系统 ... 2.挂载与磁盘分区 学习资源整理 学习 1.书上的网 ...

  5. linux 无密码登录

    环境:Linux 脚本:Python 功能:批量IP,远程执行命令.拷贝文件 运行:./ssh_scp.py iplist.txt 脚本内容: #!/usr/bin/env python# -*- c ...

  6. debug(实验)

    一.用到的简单的DOS命令: cd\ ——首先要用cd\ 退回到根目录C>下 dir ——显示文件列表 md hb ——建立hb子目录 cd hb ——进入hb子目录 copy d:\dos\m ...

  7. cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector

    各种回调函数的定义: typedef void (CCObject::*SEL_SCHEDULE)(float); typedef void (CCObject::*SEL_CallFunc)(); ...

  8. PHP 面向对象及Mediawiki 框架分析(一)

    此文是一JAVA哥大神写的,虽然他不懂PHP.我这人PHP半桶水,面向对象更是半桶水都没有,此文原本是为了让我理解MediaWiki的运行机制的,愣是用他的JAVA的面向对象知识,对Mediawiki ...

  9. Swift中的? ! as as? as!

    ?: 代表这是个可选类型(optional)的.如下,如果num有就为Int类型的,如果没有值那么就是nil. let num:Int? 当我对number进行显示赋值时那么number就是Int类型 ...

  10. Python 集合set概念和操作

    # 集合 # 概念 # 无序的, 不可随机访问的, 不可重复的元素集合 # 与数学中集合的概念类似,可对其进行交.并.差.补等逻辑运算 # 分为可变集合和非可变集合 # set # 为可变集合 # 增 ...