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.pswp.cn/news/373115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373115.shtml
英文地址,請注明出處:http://en.pswp.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;不同的語言平臺對…