三 ICE开发初级研究
2016-09
睿丰德RFID软件系统集成商
#include "Ice/Ice.h"
#include "TestICE.h"#include <string>
using namespace std;
using namespace Test;
class CTest : public TestICE
{
public:
int ping(const Ice::Current&);
int GetTime(string& strTime, const Ice::Current&);
};
这样,一个ICE的接口对象,就和你的实际方法绑定成功了。实现么,呵呵,你可以自己去写啦。 然后先看看服务器的源码。
class CMainServer : public Ice::Application{
public:
virtual int run(int, char*[]);
};
int CMainServer::run(int argc, char* argv[])
{
try
{
Ice::ObjectAdapterPtr AdaptrPtr = communicator()->createObjectAdapter("SampleTest");
Ice::ObjectPtr Object = new CTest;
AdaptrPtr->add(Object, communicator()->stringToIdentity("SampleTest"));
AdaptrPtr->activate();
communicator()->waitForShutdown();
return EXIT_SUCCESS;
}
catch(const Ice::Exception ex)
{
printf("[Main]Error = %s.\n", ex);
return -1;
}
}
int main(int argc, char* argv[])
{
CMainServer app;
app.main(argc, argv, "init.config");
getchar();
return 0;
}
这里的代码其实挺简单的,代码基本是固定的。
你需要的是修改CMainServer::init()方法,和在你的服务器exe路径下,添加一个init.config的文件。这是一个配置文件,你可以把你的一些ICE配置参数写入这个文件。
init.config里面的内容是(这是服务器的配置文件,客户端不是这个)
SampleTest.Endpoints=tcp -p 10000
这句话的意思是,你在本机开启一个服务,IP默认是你的服务器IP,端口是10000
下面说一下init()里面在干什么
Ice::ObjectAdapterPtr AdaptrPtr = communicator()->createObjectAdapter("SampleTest");
创建了一个对象代理。命名为SampleTest,这个名字你可以随便起。(communicator()实际是一个ICE的智能指针)
Ice::ObjectPtr Object = new CTest;
你创建一个ICE指针对象,指向你的类。
AdaptrPtr->add(Object, communicator()->stringToIdentity("SampleTest"));
这句话是,将你的类指针,注册到你的AdaptrPtr对象中,并关联你的"SampleTest"。内部生成一个唯一访问码和你的类指针关联。如果你有多个类,可以这样一个个指定。
AdaptrPtr->activate();
communicator()->waitForShutdown();
return EXIT_SUCCESS;
这三句是固定的,激活你的AdaptrPtr对象,并启动ICE服务。实际上,communicator()->waitForShutdown();会接管你的主线程。
好了,就这么多代码,启动你的服务器吧,如果正常,服务器会启动并占据你的10000端口。
客户端其实也很简单。
客户端的init.config文件是:
SampleTest.Proxy=SampleTest:tcp -p 10000
如果你要指定你的服务器IP,你可以
SampleTest.Proxy=SampleTest:tcp -h XXX.XXX.XXX.XXX -p 10000
如果你有多个服务器IP地址(分布网格)
SampleTest.Proxy=SampleTest:tcp -h XXX.XXX.XXX.XXX -p 10000
-h XXX.XXX.XXX.XXX -p 10000
-h XXX.XXX.XXX.XXX -p 10000
客户端代码也不复杂。
class CMainClient : public Ice::Application{
public:
virtual int run(int, char*[]);
};
int CMainClient::run(int argc, char* argv[])
{
try
{
string strData = "I'm a freeeyes.";
TestICEPrx testice = TestICEPrx::checkedCast(communicator()->propertyToProxy("SampleTest.Proxy")->ice_twoway()->ice_timeout(-1)->ice_secure(false));
if(!testice)
{
printf("[CMainClient::run]testice is error.\n");
return EXIT_FAILURE;
}
int nData = testice->GetTime(strData);
printf("[CMainClient::run]GetTime is %d.\n", nData);
return EXIT_SUCCESS;
}
catch(const Ice::Exception ex)
{
printf("[Main]Error = %s.\n", ex.what());
return -1;
}
}
int main(int argc, char* argv[])
{
CMainClient app;
app.main(argc, argv, "init.config");
getchar();
return 0;
}
这里面大部分代码都是固定的,依然只是Init里面,需要修改一下。 TestICEPrx testice = TestICEPrx::checkedCast(communicator()->propertyToProxy("SampleTest.Proxy")->ice_twoway()->ice_timeout(-1)->ice_secure(false)); 这句的代码意思是,你声明一个TestICEPrx接口类,负责从你的init.config文件中获取你的配置参数,去寻找SampleTest对应的接口对象。 if(!testice) { printf("[CMainClient::run]testice is error.\n"); return EXIT_FAILURE; } int nData = testice->GetTime(strData); printf("[CMainClient::run]GetTime is %d.\n", nData); 这句代码是,如果你正确的获得了这个对象,你就可以使用这个接口里面的内容了,具体调用方法如上。 其实,基础的ICE还是很简单的,随着我自己的研究深入,希望写出更多体会,呵呵。 代码在ICE3.3.1和VS2005下测试通过。RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成