Ice筆記—非同步程式設計demo

來源:互聯網
上載者:User

最近學習了非同步通訊這一章:非同步包括服務端的非同步指派(AMD)以及用戶端的非同步呼叫(AMI)。

下面介紹一下如何?簡單的非同步通訊(主要實現了用戶端的非同步呼叫,AMD暫未體現):

 

 1.首先編寫Ice檔案:Demo.ice

module Demo{interface Employee{      ["amd"]void add(int a, int b, out int sum);};};

     ["amd"]表示的是中繼資料,指定伺服器端將提供非同步指派的方法函數。該add函數中有兩個in參數;一個out參數,作為回傳參數。

 

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

   經過映射之後,程式將產生Demo.h與Demo.cpp檔案,如下面部分代碼所示Demo.h

// ....More code beforenamespace Demo{class Employee : virtual public ::Ice::Object{public:    typedef EmployeePrx ProxyType;    typedef EmployeePtr PointerType;        virtual ::Ice::ObjectPtr ice_clone() const;    virtual bool ice_isA(const ::std::string&, const ::Ice::Current& = ::Ice::Current()) const;    virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Current& = ::Ice::Current()) const;    virtual const ::std::string& ice_id(const ::Ice::Current& = ::Ice::Current()) const;    static const ::std::string& ice_staticId();    virtual void add_async(const ::Demo::AMD_Employee_addPtr&, ::Ice::Int, ::Ice::Int, const ::Ice::Current& = ::Ice::Current()) = 0;    // ... More code here    };// ...

 

3. 實現服務端程式

    建立Server.cpp檔案,將Demo.h中的虛方法add_async()實現。並建立servant類來繼承Ice::application類,初始化Ice run time ,同時將servant註冊到對象適配器中去。

   

#include <Demo.h>#include <Ice/Application.h>#include <IceUtil/Monitor.h>#include <iostream>using namespace std;using namespace Demo;class Manager : virtual public Employee,public IceUtil::Monitor<IceUtil::Mutex>{public:Manager():_sum(0){}~Manager(){}virtual void add_async(const ::Demo::AMD_Employee_addPtr& add_ptr, int a, int b, const ::Ice::Current& =::Ice::Current()){_sum = a+b;sleep(1);cout<< "The sum is " <<_sum<<"."<<endl;add_ptr->ice_response(_sum);   //資料處理完之後,回呼函數,調用用戶端實現的方法}private:int _sum;};class myApplication : virtual public Ice::Application {public:virtual int run(int argc , char* argv[]){    Ice::ObjectAdapterPtr adapter =                  communicator()->createObjectAdapterWithEndpoints("GameServer", "default -p 10000");Ice::ObjectPtr Manptr = new Manager;adapter->add(Manptr, communicator()->stringToIdentity("ManServer"));//將servant類對象指標ManPtr註冊到適配器中adapter->activate();  //啟用適配器,使用戶端能夠訪問適配器中已添加的servant活動表communicator()->waitForShutdown();}};int main(int argc , char * argv[]){myApplication app;app.main(argc , argv);return 0;}

4.實現用戶端程式

   建立Client.cpp檔案,實現回呼函數,建立訪問指定servant的代理。

#include<Ice/Ice.h>#include<Demo.h>#include<iostream>#include<IceUtil/IceUtil.h>using namespace std;using namespace Demo;class Client_add:public AMD_Employee_add{public: virtual void ice_response(int sum) {   cout << "receive from server--The sum is "<<sum<<"."<<endl; } virtual void ice_exception(){} virtual void ice_exception(const std::exception& e){} void failed_operation(const Ice::Exception &e){}};typedef IceUtil::Handle<Client_add> ClientAddPtr;class ClientApp : virtual public Ice::Application{public: virtual int run(int argc , char* argv[]) {  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;                 Callback_Employee_addPtr addPtr=newCallback_Employee_add(amd_add,&Client_add::ice_response,&Client_add::failed_operation);     //實現回調對象指標                emp->begin_add(10,20,addPtr);   //第三個參數為回調類的智能指標   cout<<"I'm waiting for the data from,but not blocked."<<endl; }};int main(int argc , char* argv[]){ ClientApp app; app.main(argc , argv); return 0;}

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.