快速业务通道

让C++也支持RMI

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
dquo;P1”“P2”的函数声明。

2.以内联函数的形式完成函数定义。

3.以所传入的函数返回值类型“R”,以及两个参数类型“P1”“P2”为模板参数,实现一个临时FunctionObject方法对象。

4.通过“JOINSTRING4”宏,将R和FunName以及P1,P2合成生成一个字符串作为所要添加的函数的“函数ID”。有关“函数ID”的详细内容见下文。

5.以生成的函数ID,对象本身的指针以及所要定义的函数两个参数变量作为参数调用方法对象(FunctionObject)。

6.将方法对象的返回值直接返回给调用者。

无参数

#define MY_RMI_CLIENT_FUNCTION_ADD_V_P2(FunName,P1,P2)\
public:\
void FunName(P1 p1,P2 p2)\
{\
FunctionObject<MYVOIDCLASS,P1,P2>()(JOINSTRING4(void,FunName,P1,P2),this,p1,p2);\
}

与有返回值类似,仅仅不需要将函数对象的返回值返回而已。

服务器端函数添加宏

不同于客户端直接向类模板中添加方法定义以及实现,服务器端的方法添加宏仅仅是完善服务器端基类RMIServerBase的纯虚函数:CallLocalFunction。

关于CallLocalFunction

CallLocalFunction函数由服务器端基类:RMIServerBase在收到客户端发来的函数调用请求时调用之。

其函数原型如下:

void CallLocalFunction(const char* pFuncID, void* pParaList,int tParaListLenght,SOCKET tSocket)

其中:

pFuncID 表示客户端所要调用的本地函数ID。

pParaList 内保存着所要调用的函数参数列表。

tParaListLenght 表示参数列表指针pParaList的长度。

tSocket 表示客户端的连接socket,以便通过此socket将函数的返回值发送至客户端。

关于函数ID

在客户端与服务器端的通讯过程中由“函数ID”唯一确定客户端所要调用的服务器端具体函数;

此为字符串,在使用函数添加宏时由JOINSTRINGi()宏根据所要添加的函数返回值,名称,参数类型列表直接拼接而成。

“JOINSTRINGi”宏末尾的“i”表示要拼接的单词数目。

例如一个函数的声明如下:

int sum(int a,int b);

则使用:JOINSTRING4(int,sum,int,int) 即可生成函数ID :“intsumintint”

与客户端类似,服务器端的函数添加宏亦分为“有参数”于“无参数”两种。

以下亦以添加具有两个参数的宏为例子加以说明。

有参数:

#define MY_RMI_SERVER_FUNCTION_ADD_P2(R,FunName,P1,P2)			\
if(strcmp(JOINSTRING4(R,FunName,P1,P2),pFuncID)==0) \
{ \
R m##R##FunName##P1##P2=\
pMServer->FunName(ParaListAnalyser<R,P1,P2>(pParaList).GetP1(),\
ParaListAnalyser<R,P1,P2>(pParaList).GetP2());\
SendResponse(&m##R##FunName##P1##P2,\
sizeof(R),tSocket); \
return ; \
}

1. 利用“JOINSTRING4”宏生成函数ID。

2. 生成一个与返回值类型一致的临时变量用于保存本地函数的返回值。

3. 比较宏生成的函数ID与CallLocalFunction方法中传入的pFuncID是否相同,如果相同则以保存的本地对象指针调用指定函数。

4. 用函数返回值,以及参数类型列表作为模板参数实例化一个ParaListAnalyser临时对象。

5. 调用ParaListAnalyser对象方法解析参数表。

6. 调用本地方法。

7. 将要函数返回值返回至客户端。

无参数:

#define MY_RMI_SERVER_FUNCTION_ADD_V_P2(FunName,P1,P2)			\
if(strcmp(JOINSTRING4(void,FunName,P1,P2),pFuncID)==0) \
{ \
pMServer->FunName(ParaListAnalyser<MYVOIDCLASS,P1,P2>(pParaList).GetP1(),\
ParaListAnalyser<

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号