zeroc ice (c++) window平臺客戶端服務端通信測試驗證

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啓用的鉤打上





2.客戶端項目操作

2.1 先建一個printer.ice ,然後保存會自動生成兩個printer.h ,printer.cpp文件

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

};




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;
}

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

三、服務端方面的操作

把這兩個文件複製到服務端的項目文件的當前目錄 下,並手動添加進去


備註 :客戶端和服務端一樣內容 文件

#新建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目錄下



四、驗證

打開服務端


客戶端



已經成功通信了。


五、報錯注意項事,

如果是VS2013和VS2012的.dll文件是有區別的,


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



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

否則會報如下的錯誤:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章