打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
开源项目之C++远程方法调用框架 RMI for C++

开源项目之C++远程方法调用框架 RMI for C++

分类: VC++ 233人阅读 评论(0) 收藏 举报

RMI for C++ 是一个专为 C++ 语言提供的远程方法调用框架,与 CORBA 不同的是,CORBA 适合不同的编程语言之间进行互操作,而 RMI for C++ 专为 C++ 涉及,因此效率更高,速度更快,开发也便捷。工程如图:

工程需要用到第三方库boost(已放到源码包中),Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。

程序是使用CORBA规范调用C++程序,在源码中直接使用预处理器指定接口以及封装进程参数,当然需要使用Boost库序列化本地C++程序框架。

echo服务器 实例源码:

  1. #include <RCF/RCF.hpp>   
  2.   
  3.   
  4. RCF_BEGIN(I_Echo, "I_Echo")  
  5.   RCF_METHOD_R1(std::string, echo, const std::string &);  
  6. RCF_END(I_Echo);  
  7.   
  8. class Echo  
  9. {  
  10. public:  
  11.   std::string echo(const std::string &msg) { return msg; }  
  12. };  
  13.   
  14. int main()  
  15. {  
  16.   int port = 50001;  
  17.   RCF::RcfServer server(port);  
  18.   server.bind<I_Echo, Echo>();  
  19.   server.start();  
  20.   return 0;  
  21. }  

echo客户端 实例源码:

  1. #include <RCF/RCF.hpp>  
  2.   
  3.   
  4. RCF_BEGIN(I_Echo, "I_Echo")  
  5.   RCF_METHOD_R1(std::string, echo, const std::string &);  
  6. RCF_END(I_Echo);  
  7.   
  8. int main()  
  9. {  
  10.   std::cout << RcfClient<I_Echo>("localhost",   
  11.                                50001).echo("my message");  
  12.   return 0;  
  13. }  
Boost.Serialization库,用于序列化的参数和返回值。它具有标准的类型和容器自动进行,很容易扩展到用户定义的类。它也使我们能够序列化指针,多态指针和妥善处理单个对象的多个指针。

基本用法

使用这个框架有三个基本步骤:

  1. 使用RCF_xxx宏来定义接口。
  2. 使用的的暴露RcfServer类实现该接口的对象。
  3. 使用RcfClient <>类公开的对象的服务器上调用方法。

接口定义宏的使用方法如下:

  1. RCF_BEGIN( type, type_id )  
  2.   // ...  
  3.   
  4.   RCF_METHOD_xx( return_type, name, ....):  
  5.   // ...  
  6.   
  7. RCF_END( type )  

type是为接口的标识符,TYPE_ID是一个字符串,给出一个运行时的接口的描述。

一旦我们定义了一个接口使用RCF_xxx宏,我们就可以启动服务器,并绑定到具体对象的接口:

  1. {  
  2.   // create the server and tell it which port to listen on  
  3.   
  4.   RCF::RcfServer server(port);  
  5.   
  6.   // Interface is the identifer of the interface we're exporting,  
  7.   
  8.   // Object is a type that implements that interface  
  9.   
  10.       
  11.   // one object for each client  
  12.   
  13.   server.bind<Interface, Object>();   
  14.   
  15.   // ... or one object shared by all clients  
  16.   
  17.   Object object;  
  18.   server.bind<Interface>(object);   
  19.   
  20.   // tell the server to start listening for connections  
  21.   
  22.   server.start();  
  23.   
  24.   // ...  
  25.   
  26.   
  27.   // the server will shut down automatically as it goes out of scope  
  28.   
  29. }  
该对象是静态绑定到相应的接口,也没有必要为对象从一个接口类派生的情况一样,为传统的动态多态性。取而代之的是,编译器在编译的时候,这不仅是更有效的解决了接口,但也允许更灵活的语义。
服务器可以同时处理多个客户端,即使在单线程模式下,并且可以在任何时候停止。服务器所公开的对象的生命周期来确定当前连接到给定的对象的数目,一旦有没有更多的活的对象的连接,超时被设置,并当它过期时,该对象被删除。
为了使客户端调用,我们实例化相应的RcfClient <>模板,并通过服务器的IP地址和端口号的构造函数。当第一个远程方法调用,客户端,然后尝试连接到服务器,给定对象的查询,调用远程对象的请求的成员函数,然后返回远程的返回值。

  1. // define the interface  
  2.   
  3. RCF_BEGIN(Interface, "Interface")  
  4.   RCF_METHOD_R2(int, add, intint);  
  5. RCF_END(Interface);  
  6.   
  7. // ...  
  8.   
  9.   
  10. {  
  11.   std::string ip = "localhost";  
  12.   int port = 50001;  
  13.   RcfClient<Interface> client(ip, port);  
  14.     
  15.   // connect and call the add function  
  16.   
  17.   int sum = client.add(1,1);  
  18.     
  19.   // connection closed as we exit scope  
  20.   
  21. }  

如果出现任何异常,在服务器端调用请求的对象时,一个异常的类型RCF ??:: RemoteException的传播回客户端和抛出。如果出现任何异常,在其他地方,例如在服务器端,而序列化的参数,那么服务器将强行关闭连接时,客户端会抛出一个异常。

RCF自动处理的参数类型,包括int、 double、std::string、STL容器、指针、引用、boost::shared_ptr、std::auto_ptr等等。
在CORBA中,标记的参数中有in、 out、inout,根据它们把参数进行封送处理。按照以下约定:

  1. Value: in  
  2. Pointer: in  
  3. Const reference: in  
  4. Nonconst reference: inout  
  5.   
  6. Nonconst reference to pointer: out  

要使用用户定义的类型作为参数或返回值,需要一些额外的序列化代码(Boost.Serialization),如下。

  1. struct MyStruct  
  2. {  
  3.   int a;  
  4.   int b;  
  5.   int c;  
  6.   double d;  
  7.   std::string s;  
  8.   std::map <std::string, std::vector<std::string> > m;  
  9.     
  10.   template<typename Archive>  
  11.   void serialize(Archive &archive, unsigned int version)  
  12.   {  
  13.     ar & a & b & c & d & s & m;  
  14.   }  
  15.     
  16. };  
  17.   
  18. RCF_BEGIN(MyInterface, "MyInterface")  
  19.   RCF_METHOD_R1(MyStruct, myfunc, const MyStruct &);  
  20. RCF_END(MyInterface);  


学习的目的是成熟!~

源码下载(含boost库)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
RCF—用于C++的进程间通讯
STL之函数对象
Embedding Python in C++ Applications with boost::python
聊聊C++临时对象的析构时间点
golang cgo 开发小结
什么样的 RPC 才是好用的 RPC
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服