ICE简单介绍及使用示例之-复杂数据结构通信

1.定义两个ice文件,第一个是数据结构文件ComplexData.ice

module ComplexData {
	struct DataInfo{
		int age;
		string name;
		double score;
	};

	sequence<DataInfo> MyDataList;
};

第二个是接口定义文件ComplexDatainterface.ice:

#include"ComplexData.ice"

module MyDataInterface{
	interface IMyData{
		ComplexData::MyDataList getDataList();
	};
};

分别编译两个ice文件
在这里插入图片描述

2.服务器端

#pragma once
#include "ComplexDataInterface.h"


class MyComplexData :public MyDataInterface::IMyData {
public:
	MyComplexData();
	~MyComplexData();
	virtual ::ComplexData::MyDataList getDataList(const ::Ice::Current& current = ::Ice::emptyCurrent)override;

};


#include "MyComplexData.h"

MyComplexData::MyComplexData() {
}


MyComplexData::~MyComplexData() {
}

::ComplexData::MyDataList MyComplexData::getDataList(const ::Ice::Current& current /*= ::Ice::emptyCurrent*/) {
	::ComplexData::MyDataList dataList;
	::ComplexData::DataInfo oneData;
	oneData.name = "张三";
	oneData.age = 19;
	oneData.score = 98;
	dataList.push_back(oneData);
	return dataList;
}

#include "Ice/Ice.h"
#include "MyPrinter.h"
#include "MyComplexData.h"

int main(int argc, char *argv[]) {

	int status = 0;  //退出状态
	//ic是一个指向ICE运行时资源的智能指针,通过ic可以获取运行时的各种资源。
	Ice::CommunicatorPtr ic;
	try {
		//  Ice::initialize 初始化一个ICE运行时。传入 argc,argv是因为服务代码可能会处理命令行参数(本例中不需要)。
		ic = Ice::initialize(argc, argv);
		// 创建一个 ObjectAdapterPtr adapter,名字为 SimplePrinterAdapter。这个Adapter监听TCP/IP的10000端口
		Ice::ObjectAdapterPtr adapter =
			ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10002");

		// 实例化一个PrinterI对象,该对象将为接口Printer提供服务
		Ice::ObjectPtr object = new MyPrinter();

		// 把PrinterI对象加入ObjectAdapter,标识名为SimplePrinter。当有客户端请求Printer的服务时,ObjectAdapter将会把请求转给PrinterI对象
		adapter->add(object, ic->stringToIdentity("myprinter"));

		//
		Ice::ObjectPtr object2 = new MyComplexData();
		adapter->add(object2, ic->stringToIdentity("myData"));

		// 启动ObjectAdapter, 此后ObjectAdapter开始处理实际的调用请求
		adapter->activate();

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

		// 阻塞主线程,直到服务端的运行时被关闭
		ic->waitForShutdown();

	} catch (const Ice::Exception& e) {
		status = 1;
	} catch (const char* msg) {
		status = 1;
	}

	// 程序结束时,需要销毁ICE运行时资源。如果在程序退出时没有对ICE运行时进行销毁,可能引起未知错误
	if (ic) {
		try {
			ic->destroy();
		} catch (const Ice::Exception& e) {
			status = 1;
		}

	}

	return 0;
}

3.客户端

#include "Ice/Ice.h"
#include "Printer.h"
#include "ComplexDataInterface.h"

int main(int argc, char *argv[]) {
	int status = 0;
	Ice::CommunicatorPtr ic;
	try {
		// 初始化ICE运行时
		ic = Ice::initialize(argc, argv);

		// 使用字符串来生成一个对象代理
		// 对象代理包含有服务端的服务对象的方法定义,并且负责和服务端的对象进行通信。因此客户端可以像使用本地对象一样使用服务端的对象
		// 字符串中指定了对象代理对应的服务端的对象的名称,以及服务端对象监听的协议和端口。这些信息需要跟服务端中定义的信息一致
		//ObjectPrx 在客户端代理服务器端
#if 0
		Ice::ObjectPrx base = ic->stringToProxy("myprinter:default -h 127.0.0.1 -p 10002");
#else
		Ice::ObjectPrx base = ic->stringToProxy("myprinter:default -p 10002");
#endif
		// 上面得到的是一个范型的对象代理,需要将它转换为Printer对象的代理,这样才能调用printString方法。
		// checkedCast会与服务端进行通信,以判断该对象代理能否成功转换为Printer对象代理。如果转换失败,将返回空对象代理
		Demo::PrinterPrx printer = Demo::PrinterPrx::checkedCast(base);
		if (!printer) {
			throw "Invalid proxy";
		}
		// 调用Printer对象代理的printString方法。调用将会通过对象代理被发送到服务端
		printer->printString("你好,服务器");

		printer->add(10, 36);
		printer->sub(100, 36);

		//
		Ice::ObjectPrx base2 = ic->stringToProxy("myData:default -p 10002");
		MyDataInterface::IMyDataPrx myDataInterface = MyDataInterface::IMyDataPrx::checkedCast(base2);
		if (!myDataInterface) {
			throw "Invalid proxy";
		}
		::ComplexData::MyDataList dataList = myDataInterface->getDataList();
		int num = dataList.size();
		for (int i = 0; i < num; i++) {
			ComplexData::DataInfo&oneData = dataList.at(i);
			std::cout << oneData.name << " " << oneData.age << " " << oneData.score << std::endl;
		}

	} catch (const Ice::Exception&ex) {
		status = 1;
	} catch (const char* msg) {
		status = 1;
	}
	if (ic)
		ic->destroy();

	getchar();
	return status;
}

aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值