快速业务通道

让C++也支持RMI

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

由于没有类似java的“反射”机制,标准C++下实现RMI似乎有些困难。为C++程序员所熟悉的Boost库虽然有RCF实现了类似RMI的功能,但RCF本身需依赖于Boost::serlization支持,而serlization需要编译之后方可使用,且有诸多限制。

本文试图通过C++特有的代码复用机制模拟实现具有类似RMI功能的类库,虽然不能完全实现java的RMI功能,但较之以往的C/S编程模式有了很大改观,且文中涉及很多C++代码复用技术例如模板,纯虚函数,方法对象等,希望对C++初学者有一定的帮助。

作者才疏学浅,如有不当之处还请读者指正。

关键字

RMI,反射,远程方法访问,虚函数,函数对象,默认模板参数,宏替换。

由一个例子说起

以下实现一个简单的客户端与服务器通讯的例子。例子采用传统的C/S模式,内容很简单,客户端通过调用服务器端的方法向服务器发送数据并接收返回值。

为方便起见,下面分客户端与服务器分别介绍实现。

服务器端

步骤1

创建一个类“Calculate”。

class Calculate{
public:
int sum(int a,int b)
{
printf("int类型的sum方法被调用\r\n");
t1=a;
t2=b;
return (int)(a+b);
}
double sum(double a,double b)
{
printf("double类型的sum方法被调用\r\n");
t1=a;
t2=b;
return (a+b);
}
int GetInput()
{
int a;
printf("请输入一个整数以便传输至客户端:\r\n");
scanf("%d",&a);
return a;
}
Student GetStudent(Teacher tt)
{//Student ,Teacher 均为自定义类型
student ts;
ts.age=10;
printf("GetStuden方法被调用\r\n teacher 的名称以及年龄为: %s %d\r\n",tt.name,tt.age);
strcpy(ts.name,"StudentJim");
ts.sex=1;
return ts;
}
int t1;
int t2;
};

步骤2

调用MYRMI宏实现一个服务器端模板“RMIServer”。

MY_RMI_SERVER_CLASS_DECLARE(RMIServer)
  MY_RMI_ SERVER _FUNCTION_ADD_P2(int,sum,int,int)
  MY_RMI_ SERVER _FUNCTION_ADD_P2(double,sum,double,double)
  MY_RMI_ SERVER _FUNCTION_ADD_P0(int,GetInput)
  MY_RMI_ SERVER _FUNCTION_ADD_P1(Student,GetStudent,Teacher)
MY_RMI_ SERVER _CLASS_END()

函数名称以及返回值,参数列表均与Calculate类中所声明一致。

步骤3

以“Calculate”为模板参数实现一个服务器端实例。

RMIServer < Calculate > ServerCalculate;

步骤4

实现一个Calculate类实例 calcluateObject。

Calculate calcluateObject;

步骤5

将calcluateObject对象添加进ServerCalculate中。

ServerCalculate.AddLocalObject(&calcluateObject)

步骤6

ServerCalculate在指定端口监听客户端请求,启动服务。

ServerCalculate.Listen(663)

至此服务器端部署完毕,当有客户端请求到达后,服务器便会自动启动新线程处理请求,同时不影响服务器端其它正常工作,如想停止服务,直接调用ServerCalculate.Stop()函数即可。

客户端

步骤1

创建一个与服务器端相同的类“Calculate”;

代码略

步骤2

客户端调用MYRMI宏实现一个客户端类模板“RMIClient”。MY_RMI_CLIENT_CLASS_DECLARE(RMIClient)
  MY_RMI_CLIENT_FUNCTION_ADD_P2(int,sum,int,int)
  MY_RMI_CLIENT_FUNCTION_ADD_P2(double,sum,double,double)
  MY_RMI_CLIENT_FUNCTION_ADD_P0(int,GetInput)
  MY_RMI_CLIENT_FUNCTION_ADD_P1(Student,GetStudent,Teacher)
MY_RMI_CLIENT_CLASS_END()

其中,RMIClient为模板名称,sum ,GetInput,GetStudent均为此模板所具有之方法,且均与Calculate中定义之方法相同(包括返回值,函数名,参数表)

步骤3

客户端以&ldq

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号