虽然使用传统的SOCKET编程,我们可以更为清楚程序的性能,能够更直接的操控SOCKET的设置,比如发送超时时间,接受BUFFER的大小,以及进行自己的协议加密。但是由于其调试成本较高,且不易于分布式部署
ICE 作为一个中间件技术,已经得到越来越广泛的应用。在 ICE3.2 以后,由于采用了epoll 模型,其通信层的性能提升较为明显。而且其相较于SOCKET编程一个很明显的优势是便于调试。这对于程序员来说,无疑是很大的诱惑。
网上介绍ICE原理的文献很多,我就不废话。先从一个简单的实例开始,进行我们的ICE编程入门之旅:
建立一个testice.ice文件
#ifndef _H_TEST_WG_ICE_H_
#define _H_TEST_WG_ICE_H_
module WG
{
interface WGTestIce
{
int ping();
int GetTime(out string strTime);
};
};
#endif
我们需要建立一个客户端和一个服务端。
服务端文件如下:
testiceImpl.h
#include int ping(const Ice::Current& = Ice::Current()) int GetTime(std::string& strTime, const Ice::Current& = Ice::Current()) pNow = localtime_r(&tt,&tm1); }; 上面这个类派生了接口类,用做服务端的实现。 再建立一个主函数文件testServer.cpp’ #include int createSrv() Ice::CommunicatorPtr ic; Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints(”WGSrv”,”default -p 7788″); adapter->activate(); std::cout < “now="" server="" start="" successfully.”=""><> ic->waitForShutdown(); if (ic) } } 接下来我们建立客户端测试文件 testClient.cpp Ice::CommunicatorPtr pCommunicator; const char* menu = void showMenu() showMenu(); while(c != ‘q’) } sleep(2); int main(int argc, char** argv) int tmpargc = 0; pCommunicator = Ice::initialize(tmpargc,tmpargv); pProxy = WG::WGTestIcePrx::checkedCast(pObject); return doMenu(); } 然后编译SERVER_OBJS=testice.o/ CLIENT_OBJS=testice.o/ 就可以测试了。 先启动server,再启动客户端, 效果如下: *****************test ice client *********************** 2 好,那么入门第一步就完成了。
#include
#include “testice.h”
#include
using namespace WG;
class CTestIceImpl: public WGTestIce
{
public:
CTestIceImpl(){}
~CTestIceImpl(){}
{
std::cout < “ping="" successfully.”=""><>
return 0;
}
{
time_t tt = time(NULL);
struct tm tm1;
struct tm* pNow;
if (!pNow)
{
strTime = “error”;
return -1;
}
char buf[32] = {0};
sprintf(buf,”%04d-%02d-%02d %02d:%02d:%02d”,
pNow->tm_year+1900,
pNow->tm_mon+1,
pNow->tm_mday,
pNow->tm_hour,
pNow->tm_min,
pNow->tm_sec);
strTime = buf;
return 0;
}
#endif
#include “testice.h”
#include “testiceImpl.h”
try
{
int tmpargc = 0;
char** tmpargv = NULL;
ic = Ice::initialize(tmpargc,tmpargv);
Ice::ObjectPtr object = new CTestIceImpl();
adapter->add(object, ic->stringToIdentity(”WGInterfaceAgentId”));
{
std::cout < “now="" ice="" server="" exit.”=""><>
ic->destroy();
}
catch(const Ice::Exception& ex)
{
std::cout < “catch="" ice="" exception,="" ”="">< ex=""><>
return -1;
}
catch(…)
{
std::cout < “catch="" unknown="" exception.”=""><>
return -1;
}
int main(int argc, char** argv)
{
std::cout < “before="" to="" create="" srv”=""><>
return createSrv();
#include
#include
#include “testice.h”
Ice::ObjectPrx pObject;
WG::WGTestIcePrx pProxy;
“*****************test ice client ***********************/n”
“/t 1 ping/n”
“/t 2 getTime/n”
“/t q quit/n”
“********************************************************/n”;
{
std::cout < menu=""><>
return;
}
int doMenu()
{
int ret = 0;
char c;
std::string strTime;
c = getchar();
{
switch (c)
{
case ‘1′:
ret = pProxy->ping();
std::cout < “ping="" ret="" is="" ”="">< ret=""><>
break;
case ‘2′:
ret = pProxy->GetTime(strTime);
std::cout < “gettime="" ret="" is="" ”="">< ret="">< “rettime="" is="" ”="">< strtime=""><>
break;
case ‘q’:
return 0;
break;
default:
break;
showMenu();
//system(”clear”);
c = getchar();
}
return 0;
}
try
{
if (argc <>
{
std::cout < “argc="" less="" than="" 4.="" example="" is="" :="" testclient="" wginterfaceagentid="" 127.0.0.1="" 7788″=""><>
return -1;
}
char buf[128] = {0};
snprintf(buf,sizeof(buf)-1,”%s:default -h %s -p %s”,argv[1], argv[2],argv[3]);
char** tmpargv = NULL;
pObject = pCommunicator->stringToProxy(buf);
catch(const Ice::Exception& ex)
{
std::cout < “catch="" ice="" exception,="" ”="">< ex=""><>
return -1;
}
catch(…)
{
std::cout < “catch="" unknown="" exception.="" ”=""><>
return -1;
}
testServer.o
testClient.o
1 ping
2 getTime
q quit
********************************************************
GetTime ret is 0retTime is 2008-12-29 20:15:30
联系客服