1,下载ice3.7.2 https://zeroc.com/download/Ice/3.7/Ice-3.7.2.msi
2,安装,(其中有一步可以勾选是否添加环境变量,默认勾上)全部下一步。
3,安装完成后环境变量就自动添加好了, 可以看下path中就有了安装的bin目录没,我这里是path:D:\setup\ICE\bin ,还可以再命令框输入slice2cpp -v 验证看是否出现版本号3.7.2
4,由于此版本ice安装完成后不带lib,include等目录,需要自行下载。可以在vs2013的 工具—NuGet程序包管理器—程序管理控制台 中输入 PM> Install-Package zeroc.ice.v120 -Version 3.7.2 进行在线自动下载安装。
5,下载安装好后创建Printer.ice文件
6,在cmd命令框中用slice2cpp Printer.ice命令编译该文件,生成一个Printer.h和一个Printer.cpp文件
7,在VS2013中添加生成的头文件和源文件,再创建server.cpp和client.cpp
8,项目-属性-C/C++ —附加包含目录 中加入自行下载的packages的include目录
9,项目-属性-链接器----常规—附加库目录 中加入packages的lib\win32\debug 目录
10,项目-属性-链接器----常规—附加依赖项 中加入ice37d.lib
11,将Printer.cpp中的用#include “Printer.h” 包含起来。
12,编译生成即可。
以下是代码
//Printer.ice
module Demo {
interface Printer {
void printString(string s);
};
};
//server.cpp
#include<Ice/Ice.h>
#include "Printer.h"
#include <iostream>
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;
}
//注意printString的第二个参数,这里实现可以不用理它,我们之后会讲它的作用。
int main(int argc, char* argv[])
{
//status用来表示程序退出的状态。
int status = 0;
// ic保存的是ice运行时的句柄。
Ice::CommunicatorPtr ic;
try
{
//这里写服务器实现代码
//初始化运行时
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捕捉所有ICE运行时抛出的异常。它的意图是,运行时发生异常时,栈不会崩溃返回到main中打印错误信息。
catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
}
//第2个catch 捕捉字符串常量。它的意图是,如果我们的代码出现致命错误,我们可以抛出一个带错误信息的字符串,返回到main中打印信息。
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;
}
//client.cpp
#include<Ice/Ice.h>
#include "Printer.h"
#include <iostream>
#include <string>
using namespace std;
using namespace Demo;
// 客户端只需要一个main函数,并且代码结构与服务端代码类似
int main(int argc, char * argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try{
// 初始化ICE运行时 1,创建一个通信器
ic = Ice::initialize(argc, argv);
//2. 获取通用代理
Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");// SimplePrinter就是服务端的那个ID,后面是服务器的地址
// 转换为具体代理
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();
system("pause");
return status;
}