ice库c语言例子,很不多的ICE架构入门学习例子

虽然使用传统的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 #include #include “testice.h”

#include using namespace WG;

class CTestIceImpl: public WGTestIce

{

public:

CTestIceImpl(){}

~CTestIceImpl(){}

int ping(const Ice::Current& = Ice::Current())

{

std::cout << “ping successfully.” << std::endl;

return 0;

}

int GetTime(std::string& strTime, const Ice::Current& = Ice::Current())

{

time_t tt = time(NULL);

struct tm tm1;

struct tm* pNow;

pNow = localtime_r(&tt,&tm1);

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

上面这个类派生了接口类,用做服务端的实现。

再建立一个主函数文件testServer.cpp’

#include #include “testice.h”

#include “testiceImpl.h”

int createSrv()

try

{

int tmpargc = 0;

char** tmpargv = NULL;

Ice::CommunicatorPtr ic;

ic = Ice::initialize(tmpargc,tmpargv);

Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints(”WGSrv”,”default -p 7788″);

Ice::ObjectPtr object = new CTestIceImpl();

adapter->add(object, ic->stringToIdentity(”WGInterfaceAgentId”));

adapter->activate();

std::cout << “now server start successfully.” << std::endl;

ic->waitForShutdown();

if (ic)

{

std::cout << “now ice server exit.” << std::endl;

ic->destroy();

}

}

catch(const Ice::Exception& ex)

{

std::cout << “catch ice exception, ” << ex << std::endl;

return -1;

}

catch(…)

{

std::cout << “catch unknown exception.” << std::endl;

return -1;

}

int main(int argc, char** argv)

{

std::cout << “before to create Srv” << std::endl;

return createSrv();

}

接下来我们建立客户端测试文件 testClient.cpp

#include #include #include “testice.h”

Ice::CommunicatorPtr    pCommunicator;

Ice::ObjectPrx          pObject;

WG::WGTestIcePrx        pProxy;

const char* menu =

“*****************test ice client ***********************/n”

“/t 1 ping/n”

“/t 2 getTime/n”

“/t q quit/n”

“********************************************************/n”;

void showMenu()

{

std::cout << menu << std::endl;

return;

}

int doMenu()

{

int ret = 0;

char c;

std::string strTime;

showMenu();

c = getchar();

while(c != ‘q’)

{

switch (c)

{

case ‘1′:

ret = pProxy->ping();

std::cout << “ping ret is ” << ret << std::endl;

break;

case ‘2′:

ret = pProxy->GetTime(strTime);

std::cout << “GetTime ret is ” << ret << “retTime is ” << strTime << std::endl;

break;

case ‘q’:

return 0;

break;

default:

break;

}

sleep(2);

showMenu();

//system(”clear”);

c = getchar();

}

return 0;

}

int main(int argc, char** argv)

try

{

if (argc < 4)

{

std::cout << “argc less than 4. example is : testClient WGInterfaceAgentId 127.0.0.1 7788″ << std::endl;

return -1;

}

char buf[128] = {0};

snprintf(buf,sizeof(buf)-1,”%s:default -h %s -p %s”,argv[1], argv[2],argv[3]);

int tmpargc = 0;

char** tmpargv = NULL;

pCommunicator = Ice::initialize(tmpargc,tmpargv);

pObject = pCommunicator->stringToProxy(buf);

pProxy = WG::WGTestIcePrx::checkedCast(pObject);

return doMenu();

}

catch(const Ice::Exception& ex)

{

std::cout << “catch ice exception, ” << ex << std::endl;

return -1;

}

catch(…)

{

std::cout << “catch unknown exception. ” << std::endl;

return -1;

}

然后编译SERVER_OBJS=testice.o/

testServer.o

CLIENT_OBJS=testice.o/

testClient.o

就可以测试了。

先启动server,再启动客户端, 效果如下:

*****************test ice client ***********************

1 ping

2 getTime

q quit

********************************************************

2

GetTime ret is 0retTime is 2008-12-29 20:15:30

好,那么入门第一步就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员的十个层次,你属于哪一层?(转)

自西方文艺复兴以来&#xff0c;中国在自然科学方面落后西方很多&#xff0c;软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见&#xff0c;有些人认为中国的程序员水平远落后于西方&#xff0c;有些则认为中国的程序员个人能力并不比西方的程序员差&…

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构&#xff08;硬件系统&#xff09; 操作系统的定义&#xff1a;操作系统是掌控计算机上所有事情的软件系统(硬件资源&#xff0c;软件资源) 操作系统对内存&#xff0c;i/o&#xff0c;cpu&#x…

高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx

...快速中值滤波及c语言实现学生姓名&#xff1a; 刘 勇 学 号&#xff1a; 6100410218 专业班级&#xff1a; 数媒101【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法&#xff0c;在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题&#xff0e;解…

Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!

红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian &#xff0c;其屡获殊荣的建在Java虚拟机&#xff08;JVM&#xff09;运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无法测试或测试成本…

Jquery选择器特殊字符问题

场景&#xff1a; $("#" AAA "")&#xff0c;AAA代表某表单ID 当AAA为普通字符串时&#xff0c;ok&#xff1b; 当AAA含有特殊符号时&#xff08;eg:a.b&#xff09;&#xff0c;获取不到该对象&#xff1b; 原因&#xff1a;特殊符号会进行转义&#xf…

qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用

九、 智能调频、空码检索、词序固定在QQ五笔中还有一些小亮点&#xff0c;比如它可以根据“最近输入”、“输入次数”对候选词排序。同时为了加快检索速度&#xff0c;默认只在常用字库(GB2312)中检索&#xff0c;只有出现空码后才会继续搜索容量更大的GBK字库&#xff0c;很好…

DFS:C 小Y的难题(1)

解题心得&#xff1a; 1、在明确使用DFS之后一定要找到递归函数的出口、方向&#xff0c;以及递归的点&#xff08;在某个情况下开始递归&#xff09;(void 也可以return&#xff0c;但是没有返回值)。递归时也要有递归的方向&#xff0c;最后都能够达到递归的出口。 2、在DF…

使用ActiveMQ支持Spring Integration路由

正如我在上 一篇 文章中所讨论的那样 &#xff0c;Spring Integration&#xff08;SI&#xff09; 是在Spring Framework之上构建的路由框架 &#xff0c;它使您可以使用经过验证的企业集成模式来通过消息传递解决系统集成问题。 配置好SI并执行路由和中介逻辑后&#xff0c;您…

quagga源码分析--路由信息处理zebra-rib

对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能&#xff0c;如何在内核进行路由增加&#xff0c;更新&#xff0c;删除是一个复杂的过程。 quagga在thread任务调度中加入了一种工作队列&#xff0c;work_queue&#xff0c;与内核的工作队列类似&#xff0c;是…

android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话&#xff0c;拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法&#xff0c;由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…

android在listview中放入从sdcard读取的bitmap

重写viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

将状态机模式实现为流处理器

在我的上一个博客中&#xff0c;我说我真的以为某些“四人行”&#xff08;GOF&#xff09;模式已经过时了&#xff0c;如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine不是那么有用&#xff0c;因为您通常会想到另一种更简单的方式来执行您正在执行的事情&#xff0…

android 自定义actionbar,如何让android的actionbar浮动且透明

如上图所示&#xff0c;谷歌地图的actionbar是透明的&#xff0c;且浮动在整个布局之上&#xff0c;没有占用布局空间。其实要做到这样的效果&#xff0c;我们首先想到的是两个方面&#xff1a;1.将让actionbar浮动起来。2.给actionbar一个背景&#xff0c;可以为颜色也可以为图…

CentOS 7安装redis及php扩展

安装remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 确认使用remi源时安装的Redis版本。 安装Redis 使用remi源yum安装Redis。 # yum …

对Openshift上的Play Framework 2应用进行故障排除

Openshift故障排除 使用“ 自己动手”应用程序类型&#xff0c;您实际上可以有很大的自由度来支持几乎可以在Linux机器上构建和运行的任何框架或服务器。 但是您必须做功课&#xff0c;并做一些研究。 因此&#xff0c;在本文中&#xff0c;我将向您展示一些我在使用Openshift和…

关于更换头像的整个过程理解

之前我遇到一个问题&#xff0c;就是怎样修改头像&#xff0c;都没有更改&#xff0c;后来把某个参数置为null&#xff0c;就解决了问题&#xff0c;但是知其然还要知其所以然&#xff0c;现在还是着重去梳理整个流程 头像&#xff0c;需要关注的是3个变量&#xff1a; 本地地址…

Ajax与CustomErrors的尴尬

在ASP.NET程序中&#xff0c;为了给用户显示友好的错误信息&#xff0c;通常在web.config中进行如下的设置&#xff1a; <customErrors mode"RemoteOnly" defaultRedirect"/error/error.htm"> </customErrors> 但如果是一个ajax请求在服务端发…

JSF开发人员应该知道的5种有用方法

这篇文章的目的是总结一些JSF开发人员可以在日常工作中使用的便捷方法。 实用程序类是将所有方法放在一起的好地方。 我会称此类为FacesAccessor。 第一种方法可能是最常用的方法。 它以给定名称返回托管bean。 必须按faces-config.xml或注释注册该bean。 注入是好的&#xff0…

android项目编码规范,Android 项目规范

Android 项目规范本文档的目的是定义项目规范。这些应遵循整个 Android 项目以帮助我们保持整洁和统一的代码库。 &#x1f642;

Java创建WebService服务及客户端实现

简介 WebService是一种服务的提供方式&#xff0c;通过WebService&#xff0c;不同应用间相互间调用变的很方便&#xff0c;网络上有很多常用的WebService服务&#xff0c;如&#xff1a;http://developer.51cto.com/art/200908/147125.htm&#xff0c;不同的语言平台对…