最近学习了异步通信这一章:异步包括服务端的异步分派(AMD)以及客户端的异步调用(AMI)。

下面介绍一下如何实现简单的异步通信(主要实现了客户端的异步调用,AMD暂未体现):

1.首先编写Ice文件:Demo.ice

[cpp] view plaincopy
  1. module Demo{
  2. interface Employee{
  3. ["amd"]void add(int a, int b, out int sum);
  4. };
  5. };

["amd"]表示的是元数据,指定服务器端将提供异步分派的方法函数。该add函数中有两个in参数;一个out参数,作为回传参数。

2.映射到C++代码:使用命令 slice2cpp Demo.ice

经过映射之后,程序将生成Demo.h与Demo.cpp文件,如下面部分代码所示Demo.h

[cpp] view plaincopy
  1. // ....More code before
  2. namespace Demo
  3. {
  4. class Employee : virtual public ::Ice::Object
  5. {
  6. public:
  7. typedef EmployeePrx ProxyType;
  8. typedef EmployeePtr PointerType;
  9. virtual ::Ice::ObjectPtr ice_clone() const;
  10. virtual bool ice_isA(const ::std::string&, const ::Ice::Current& = ::Ice::Current()) const;
  11. virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Current& = ::Ice::Current()) const;
  12. virtual const ::std::string& ice_id(const ::Ice::Current& = ::Ice::Current()) const;
  13. static const ::std::string& ice_staticId();
  14. virtual void add_async(const ::Demo::AMD_Employee_addPtr&, ::Ice::Int, ::Ice::Int, const ::Ice::Current& = ::Ice::Current()) = 0;
  15. // ... More code here
  16. };
  17. // ...

3. 实现服务端程序

新建Server.cpp文件,将Demo.h中的虚方法add_async()实现。并新建servant类来继承Ice::application类,初始化Ice run time ,同时将servant注册到对象适配器中去。

[cpp] view plaincopy
  1. #include <Demo.h>
  2. #include <Ice/Application.h>
  3. #include <IceUtil/Monitor.h>
  4. #include <iostream>
  5. using namespace std;
  6. using namespace Demo;
  7. class Manager : virtual public Employee,public IceUtil::Monitor<IceUtil::Mutex>
  8. {
  9. public:
  10. Manager():_sum(0){}
  11. ~Manager(){}
  12. virtual void add_async(const ::Demo::AMD_Employee_addPtr& add_ptr, int a, int b, const ::Ice::Current& =::Ice::Current())
  13. {
  14. _sum = a+b;
  15. sleep(1);
  16. cout<< "The sum is " <<_sum<<"."<<endl;
  17. add_ptr->ice_response(_sum);   //数据处理完之后,回调函数,调用客户端实现的方法
  18. }
  19. private:
  20. int _sum;
  21. };
  22. class myApplication : virtual public Ice::Application
  23. {
  24. public:
  25. virtual int run(int argc , char* argv[])
  26. {
  27. Ice::ObjectAdapterPtr adapter =
  28. communicator()->createObjectAdapterWithEndpoints("GameServer", "default -p 10000");
  29. Ice::ObjectPtr Manptr = new Manager;
  30. adapter->add(Manptr, communicator()->stringToIdentity("ManServer"));//将servant类对象指针ManPtr注册到适配器中
  31. adapter->activate();  //激活适配器,使客户端能够访问适配器中已添加的servant活动表
  32. communicator()->waitForShutdown();
  33. }
  34. };
  35. int main(int argc , char * argv[])
  36. {
  37. myApplication app;
  38. app.main(argc , argv);
  39. return 0;
  40. }

4.实现客户端程序

新建Client.cpp文件,实现回调函数,创建访问指定servant的代理。

[cpp] view plaincopy
  1. #include<Ice/Ice.h>
  2. #include<Demo.h>
  3. #include<iostream>
  4. #include<IceUtil/IceUtil.h>using namespace std;
  5. using namespace Demo;class Client_add:public AMD_Employee_add
  6. {
  7. public:
  8. virtual void ice_response(int sum)
  9. {
  10. cout << "receive from server--The sum is "<<sum<<"."<<endl;
  11. }
  12. virtual void ice_exception(){}
  13. virtual void ice_exception(const std::exception& e){}
  14. void failed_operation(const Ice::Exception &e){}
  15. };
  16. typedef IceUtil::Handle<Client_add> ClientAddPtr;class ClientApp : virtual public Ice::Application
  17. {
  18. public:
  19. virtual int run(int argc , char* argv[])
  20. {
  21. Ice::ObjectPrx base = communicator()->stringToProxy("ManServer:default -p 10000");  EmployeePrx emp = EmployeePrx::checkedCast(base);  if(!emp)throw "Invalid Proxy!";  ClientAddPtr amd_add = new Client_add;
  22. Callback_Employee_addPtr addPtr=newCallback_Employee_add(amd_add,&Client_add::ice_response,&Client_add::failed_operation);     //实现回调对象指针
  23. emp->begin_add(10,20,addPtr);   //第三个参数为回调类的智能指针   cout<<"I'm waiting for the data from,but not blocked."<<endl; }
  24. };int main(int argc , char* argv[])
  25. {
  26. ClientApp app;
  27. app.main(argc , argv); return 0;
  28. }

5. 编译Server.cpp: g++ Demo.cpp Server.cpp -o Server -lIce -lIceUtil -I./ -I/opt/Ice-3.4.2/include -L/opt/Ice-3.4.2/lib

编译Client.cpp: g++ Demo.cpp Client.cpp -o Client -lIce -lIceUtil -I./ -I/opt/Ice-3.4.2/include -L/opt/Ice-3.4.2/lib

运行服务端:./Server 运行客户端:./Client

Ice笔记---异步程序设计demo相关推荐

  1. Vue异步组件Demo

    Vue异步组件Demo 在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载.为了进一步简化,Vue.js 允许将组件定义为一个工厂函数,异步地解析组件的定义.Vue.js 只在组件需要 ...

  2. go-pitaya学习笔记(9)-rate_limiting demo分析

    学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...

  3. go-pitaya学习笔记(6)-cluster-protobuf demo分析

    学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...

  4. go-pitaya学习笔记(7)-custom_metrics demo分析

    学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...

  5. JavaScript 学习笔记 - 挂载事件 Demo

    JavaScript 学习笔记 - 挂载事件 Demo 例子 addEventListener 监听事件 挂载事件的同时带上参数 dispatchEvent 触发事件 removeEventListe ...

  6. motan学习笔记 三 motan Demo 分析

    motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Demo 之 ...

  7. ZeroC ICE java异步实现方式(ami/amd)

    首先说说ami 和amd 的区别(以下为个人见解,仅供参考.如有疑问欢迎提出来) ami (异步方法调用): 仅仅基于ice 的同步方式扩展了异步的扩展方式,其他理念改动不大,使用起来好理解,但是服务 ...

  8. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  9. ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)

    此次的demo是一个页面,页面上有两行字,然后后面用ajax,使用一个下拉框去替换第一行文字[/code] 第一个是被替换的网页 var xmlhttprequest; function create ...

最新文章

  1. CSS盒子模型(border、padding、margin、圆角边框、盒子阴影、文字阴影、新闻列表综合案例、新浪导航栏案例)
  2. hdu 1263 水果
  3. 【Coursera课程笔记】Web智能和大数据Week3_MapReduce
  4. 【数据结构与算法】之旋转图像的求解算法
  5. 选择HLS或WebRTC需要考虑的五个因素
  6. ORBSLAM2在Ubuntu14.04上详细配置流程
  7. delete from表名和truncate table 表名的区别
  8. 如何Super Vectorizer从Mac 上的图像中删除多余的颜色区域?
  9. Hive入门(三)分桶
  10. 电脑音箱常见故障排查技巧
  11. IPhone之NSXMLParser的使用
  12. 5G时代已到,还有哪些值得关心的安全问题?
  13. vscode设置背景图片
  14. MindManager中读图工具的使用
  15. C++智能指针的实现与使用(详解)
  16. Box2DWeb_04之碰撞检测
  17. android 仿手写字体下载,手写毛笔字体在线生成器-手写毛笔字软件下载v1.0 安卓版-西西软件下载...
  18. 前端页面插入Flash动画
  19. abb机器人指令手册_ABB机器人加速度设置
  20. 惠普服务器如何插内存

热门文章

  1. php中怎么定义page,css @page的使用与定义详解
  2. ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)
  3. 大白话系列之C#委托与事件讲解大结局
  4. Tomcat——目录结构
  5. Visual Studio Code 配置指南
  6. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
  7. 使用Lex将C/C++文件输出为HTML文件
  8. 基元检测 Primitive Detection
  9. Day 26: TogetherJS —— 让我们一起来编程!
  10. 数字图像处理:第十八章 彩色图象处理