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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章