VS2005寫ICE的一個完整的例子
VS2005寫ICE的一個完整的例子
開發環境: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.cpp和Printer.h檔案。 Printer.cpp檔案必須在客戶端和伺服器端進行編譯和連結。(注意:Printer.ice檔案不要放在磁碟根目錄下,否則會報錯)。
5、配置IDE開發環境並建立服務端,因為我自己使用的是VS2005,就簡單介紹下VS2005的配置。以伺服器建立為例。
1)新建一個名為“consoleServer”的Win32 console application工程。並建立 “include”目錄和“init.config
2)新增依賴的標頭檔案和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
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)”即可 如下圖所示:
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.