win7 ,ice 3.5.1 


一、下载ICE安装包

Ice-3.5.1-6.msi  Ice-PDBs-3.5.1-6.msi   Ice-3.5.1-4-ThirdParty.msi

备注 :有些反应点下载官网时没有反应多半是访问的问题,考虑用VPN或者是其它方式 

3.5.1 最高支持VS2013,这个要留意下,如果你的版本是3.4.2或者其它的装完包后在VS的工程菜单里是看不到ICE CONFIGURATION,详细的可以看官网说明 

二、新建一个解决方案,里边包含客户端和服务端的程序 ,同时要记得把ICE启用的钩打上

zeroc ice (c++) window平台客户端服务端通信测试验证_#include

zeroc ice (c++) window平台客户端服务端通信测试验证_服务端_02

zeroc ice (c++) window平台客户端服务端通信测试验证_客户端_03


2.客户端项目操作

2.1 先建一个printer.ice ,然后保存会自动生成两个printer.h ,printer.cpp文件

module demo
{
 interface IPrinter
 {
 void print(string msg);
 };};

zeroc ice (c++) window平台客户端服务端通信测试验证_客户端_04



2.2 然后在源文件中添加Client.cpp文件

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


//#include "stdafx.h"
#include <Ice/Ice.h>
#include <IceUtil/IceUtil.h>
#include <iostream>
#include "printer.h"  // 包含接口头文件


int main(int argc, char * argv[])
{
 // 1. 创建一个通信器
 Ice::CommunicatorPtr communicator = Ice::initialize();


 // 2. 获取通用代理
 Ice::ObjectPrx base = communicator->stringToProxy("myprinter:default -h 127.0.0.1 -p 10001"); // myprinter就是服务端的那个ID,后面是服务器的地址


 try
 {
 // 转换为具体代理
 demo::IPrinterPrx printerPrx = demo::IPrinterPrx::checkedCast(base);


 // 获取到代理之后,就可以直接操作了
 printerPrx->print("hello");
 }
 catch (Ice::Exception& ex)
 {
 std::cout << ex.what() << std::endl; // 获取代理失败,打印出获取代理失败的原因
 getchar();
 }
 getchar();
 return 0;
}

客户端差不多就操作完成了

三、服务端方面的操作

把这两个文件复制到服务端的项目文件的当前目录 下,并手动添加进去

zeroc ice (c++) window平台客户端服务端通信测试验证_#include_05

备注 :客户端和服务端一样内容 文件

#新建DemoPrinter.h
#pragma once
#include "printer.h"


class DemoPrinter:public demo::IPrinter
{
public:
 DemoPrinter();
 ~DemoPrinter();


 virtual void print(const ::std::string&, const ::Ice::Current&) override;


};#新建DemoPrinter.cpp文件
//#include "stdafx.h"
#include <DemoPrinter.h>
#include <iostream>




DemoPrinter::DemoPrinter()
{
}




DemoPrinter::~DemoPrinter()
{
}


void DemoPrinter::print(const ::std::string& msg, const ::Ice::Current& = ::Ice::Current())
{
 std::cout << "message from client: " << msg << std::endl;}

#新增PrinterServer.cpp文件
// PrinterServer.cpp : Defines the entry point for the console application.
//


//#include "stdafx.h"
      
#include "DemoPrinter.h"    // 实现打印机接口的类
#include <Ice/Ice.h>              // 需要使用Ice的一些类
#include <IceUtil/IceUtil.h>      // Ice的工具类




int main(int argc, char* argv[])
{
 /*Ice的配置,可以先不管,直接在代码里面编写*/
 //Ice::InitializationData iniData; // 通信器初始化数据
 //iniData.properties = Ice::createProperties(); // 创建配置属性


 // 1. 创建一个通信器
 Ice::CommunicatorPtr communicator = Ice::initialize();


 // 2. 创建一个适配器,所有的服务对象都必须添加到适配器上
 Ice::ObjectAdapterPtr pAdapter = communicator->createObjectAdapterWithEndpoints("MyAdapter", "default -p 10001");
 //  参数1 “MyAdapter” 是适配器的ID,可以随便给 
 //  参数2  default 表示使用缺省协议(TCP), -h 后面是ip地址, -p 指定端口号


 // 3.创建一个服务对象
 demo::IPrinterPtr printer = new DemoPrinter();
 Ice::Identity id = communicator->stringToIdentity("myprinter"); // 打印服务的ID,这个必须有,客户端根据这个查找打印服务的代理。
 pAdapter->add(printer, id); // 到这里打印服务就添加好了


 // 启动对外服务
 pAdapter->activate();


 std::cout << "==>  server started" << std::endl;


 communicator->waitForShutdown(); // 等待通信器关闭


 return 0;
}

然后再逐个编译,也可以点击重新生成方案。

编译完成 后会生成两个。EXE文件在DEBUG目录下

zeroc ice (c++) window平台客户端服务端通信测试验证_#include_06


四、验证

打开服务端

zeroc ice (c++) window平台客户端服务端通信测试验证_客户端_07

客户端

zeroc ice (c++) window平台客户端服务端通信测试验证_#include_08


已经成功通信了。


五、报错注意项事,

如果是VS2013和VS2012的.dll文件是有区别的,

zeroc ice (c++) window平台客户端服务端通信测试验证_客户端_09

C:\Program Files (x86)\ZeroC\Ice-3.5.1


zeroc ice (c++) window平台客户端服务端通信测试验证_服务端_10

C:\Program Files (x86)\ZeroC\Ice-3.5.1\bin\vc120 (注意了不是vc110)

否则会报如下的错误:

zeroc ice (c++) window平台客户端服务端通信测试验证_#include_11