1. 程式人生 > >VS2005寫ICE的一個完整的例子

VS2005寫ICE的一個完整的例子

VS2005ICE的一個完整的例子

開發環境:VS2005 Ice 版本 3.3.1

說明:客戶端使用ICE遠端呼叫伺服器端的方法(printString(string s)

步驟說明:

1、安裝Ice 版本 3.3.1

2、設定ICE的環境變數:

ICE_Dir = =<Ice 安裝的根目錄>

PATH=%ICE_Dir%/bin

設定完變數以後可以在命令列下使用 slice2cpp命令檢查Ice安裝是否成功。

3、編寫介面的定義檔案“Printer.ice:內容如下:

module Demo {

interface Printer {

void printString(string s);

};

};

4、使用slice2cpp命令:slice2cpp <檔案目錄>/Printer.ice 編譯ice檔案,執行完該命令會生成Printer.cppPrinter.h檔案。 Printer.cpp檔案必須在客戶端和伺服器端進行編譯和連結。注意:Printer.ice檔案不要放在磁碟根目錄下,否則會報錯)。

5、配置IDE開發環境並建立服務端,因為我自己使用的是VS2005,就簡單介紹下VS2005的配置。以伺服器建立為例。

1)新建一個名為“consoleServer”的Win32 console application工程。並建立 “include”目錄和“init.config

”檔案,init.config檔案在初始化ICE時候用到。

2)新增依賴的標頭檔案和LIB目錄和依賴具體lib如下圖設定:

   引入標頭檔案

 引入LIB

引入LIB檔案

6、編寫並編譯伺服器端程式碼 程式碼如下:

// consoleTest.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <Ice/Ice.h>

#include <Printer.h>

#include <string>

using namespace std;

using namespace

Demo;

class PrinterI : public Printer {

public:

virtual void printString(const string& s,

const Ice::Current&);

};

void PrinterI::printString(const string& s, const Ice::Current&)

{

cout << s << endl;

}

int _tmain(int argc, _TCHAR* argv[])

{

int status = 0;

Ice::CommunicatorPtr ic;

try {

Ice::InitializationData initData;

initData.properties = Ice::createProperties();

initData.properties->load("../include/init.config");

ic = Ice::initialize(initData);

//ic = Ice::initialize(argc, argv);

Ice::ObjectAdapterPtr adapter

= ic->createObjectAdapterWithEndpoints(

"SimplePrinterAdapter", "default -p 10000");

Ice::ObjectPtr object = new PrinterI;

adapter->add(object,ic->stringToIdentity("SimplePrinter"));

adapter->activate();

ic->waitForShutdown();

} catch (const Ice::Exception& e) {

cerr << e << endl;

status = 1;

} catch (const char* msg) {

cerr << msg << endl;

status = 1;

}

if (ic) {

try {

ic->destroy();

} catch (const Ice::Exception& e) {

cerr << e << endl;

status = 1;

}

}

return status;

}

(注:如果細心你會發現自動生成的Printer.cpp檔案沒有首行引入“#include "stdafx.h"”標頭檔案,如果進行編譯可能出現如下的錯誤:printer.cpp(373) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?),只要修改該檔案的預編譯屬性為“Create Precompiled Header (/Yc)”即可 如下圖所示:

 CPP檔案設定預編譯

7、建立客戶端工程

1)新建一個名為“consoleServer”的Win32 console application工程。並建立 “include”目錄和“init.config”檔案,init.config檔案在初始化ICE時候用到。

2)第二部同伺服器的設定一樣

8、編寫並編譯客戶端程式碼 程式碼如下:

// consoleClient.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <Ice/Ice.h>

#include <Printer.h>

#include <string>

using namespace std;

using namespace Demo;

int _tmain(int argc, _TCHAR* argv[])

{

int status = 0;

Ice::CommunicatorPtr ic;//通訊器

try {

Ice::InitializationData initialData;

initialData.properties = Ice::createProperties();

initialData.properties->load("../include/init.config");

ic = Ice::initialize(initialData);

Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");

PrinterPrx printer = PrinterPrx::checkedCast(base);//介面代理

if (!printer)

throw "Invalid proxy";

printer->printString("Hello World!");

} catch (const Ice::Exception& ex) {

cerr << ex << endl;

status = 1;

} catch (const char* msg) {

cerr << msg << endl;

status = 1;

}

if (ic)

ic->destroy();

return status;

}

9、測試程式

記住先啟動伺服器程式,然後啟動客戶端程式,否則就會出現如下錯誤:

Network.cpp:471: Ice::ConnectFailedException:

connect failed: Connection refused

正常執行的結果為伺服器端會列印如下字串。

 輸出結果

END.