让C++也支持RMI
uo;Calculate”为模板参数,声明一个实例“ClientCalculate”,并调用Connect方法链接到服务器。
直接调用ClientCalculate成员方法,即可实现客户端于服务器通讯。
主要特点 由以上过程可见,采用MYRMI宏实现客户端与服务器之间的通讯过程有如下特点: 1. 实现简单。客户端与服务器传输不同类型的数据无需用大量switch-case语句判断 2. 可扩展性强。动态添加方法比较容易。只需在Calculate类中添加相应定义,并采用MYMRI宏向客户端以及服务器端分别添加所需之方法,即可由客户端对象ClientCalculate直接调用。 3. 通讯过程可控。如果需要,仅需在服务器端调用AddLocalObject()绑定至其它同类型服务器对象即可。Boost中的RCF库尚不具备此功能! 4. 多线程处理。服务器端采用多线程处理,不影响服务器的其它操作。 5. 线程安全的。多个客户端同时连接时,程序自动完成互斥与同步工作。 6. 采用tcp链接。安全可靠。 7. 采用标准C++语法实现。移植性,跨平台性强。 8. 源码发布。只需向程序中添加相应的源文件即可,无需额外的动态链接库支持。 系统实现 本系统采用大量宏替换技术作为其实现方式,其间涉及模板,纯虚函数,方法对象,联合类型等多种C++代码复用技术,为清晰起见,首先介绍系统中涉及的几种主要数据结构。 主要数据结构 class RMIClientBase:客户端数据传输基类。 负责客户端与服务器之间的数据通讯,管理和维护同服务器的连接。具体功能函数如下: 连接服务器:bool Connect(char* tRomateIP,int tRomatePort); 关闭连接:void StopConnect(); 判断链接有效性:bool IsAvailable(); 向服务器传递数据接收返回内容:bool CallRemoteFunction(RemoteFunctionStub* tRFStub) class RMIServerBase:服务器端数据传输基类。 接收客户端所传入之参数。 将本地函数返回值返回到客户端。 负责多个客户端连接管理(启动/关闭链接,多线程间互斥同步等),具体功能函数如下: 开始监听:bool Listen(int tPort); 停止监听:bool Stop(); 监听网络端连接请求:static DWORD WINAPI ListenThread(LPVOID pPara); 为不影响服务器正常工作,新启动一个线程负责监听客户端请求。对于每个新产生的客户 端连接请求,再次启动一个线程调用ProcessRequest处理新产生的客户端请求。 处理单个链接请求:static DWORD WINAPI ProcessRequest(LPVOID pPara); 对于每个客户端请求,服务器均启动一个单独线程处理其请求,线程间自动完成互斥以及同步工作。 调用本地函数:virtual void CallLocalFunction(const char* pFuncID, void* pParaList,int tParaListLenght,SOCKET tSocket)=0; 此函数为“纯虚函数”由其基类实现之:根据pFuncID指定的本地函数,以pParaList内保存的参数列表为参数调用本地函数。 class FunctionObject:函数对象模板。 将客户但调用函数之参数列表以及函数ID封装为“函数存根(RemoteFunctionStub)”。 以此函数存根为参数调用RMIServerBase的纯虚函数CallRemoteFunction,将函数ID以及参数列表传输到远端服务器。 接受服务器返回,并将结果强制转换为所调用函数的返回值类型,返回调用者。 struct RemoteFunctionStub:函数存根。 用于客户端与服务器间传递所调用函数之信息。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |