Ice笔记---异步程序设计demo

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

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

 

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

  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

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


 

3. 实现服务端程序

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

   

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



4.实现客户端程序

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

  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.                  
  23.   Callback_Employee_addPtr addPtr=newCallback_Employee_add(amd_add,&Client_add::ice_response,&Client_add::failed_operation);     //实现回调对象指针                
  24.   emp->begin_add(10,20,addPtr);   //第三个参数为回调类的智能指针   cout<<"I'm waiting for the data from,but not blocked."<<endl; }  
  25. };int main(int argc , char* argv[])  
  26. {  
  27.  ClientApp app;  
  28.  app.main(argc , argv); return 0;  
  29. }  

 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值