Posted on 2005-12-29 14:42
小明 阅读(3853)
评论(5) 编辑 收藏 引用 所属分类:
C/C++
当我第一次使用boost::serlization的时候,就意识到它在RMI(Remote method Invoke)的意义,因为JAVA RMI就是建立在java serlization的基础之上。
先来个boost::serlization使用的例子
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
void test_serialization()
{
boost::archive::text_oarchive to(cout , boost::archive::no_header);
int i = 10;
string s = "This is a test\n";
to & i;
to & s;
ofstream f("test.xml");
boost::archive::xml_oarchive xo(f);
xo & BOOST_SERIALIZATION_NVP(i) & BOOST_SERIALIZATION_NVP(s);
boost::archive::text_iarchive ti(cin , boost::archive::no_header);
ti & i & s;
cout <<"i="<< i << endl;
cout <<"s="<< s << endl;
}
假如我们可以将object序列化以后通过socket传过去,就可以实现RMI了。
当然这种方法只能是在C++程序之间传递。
今天在codeproject上面发现已经有人已经这样做了,原来早就有人跟我有一样的想法
看看作者封装的结果吧
server端:
#include <RCF/RCF.hpp>
RCF_BEGIN(I_Echo, "I_Echo")
RCF_METHOD_R1(std::string, echo, const std::string &);
RCF_END(I_Echo);
class Echo
{
public:
std::string echo(const std::string &msg) { return msg; }
};
int main()
{
int port = 50001;
RCF::RcfServer server(port);
server.bind<I_Echo, Echo>();
server.start();
return 0;
}
client端:
#include <RCF/RCF.hpp>
RCF_BEGIN(I_Echo, "I_Echo")
RCF_METHOD_R1(std::string, echo, const std::string &);
RCF_END(I_Echo);
int main()
{
std::cout << RcfClient<I_Echo>("localhost",
50001).echo("my message");
return 0;
}
比较简洁,利用了boost强大的function,thread,serlization
RCF下载地址:
http://www.codeproject.com/threads/RMI_For_Cpp/RCF.zip介绍:
http://www.codeproject.com/threads/RMI_For_Cpp.asp