Posted on 2005-12-29 14:42
小明 閱讀(3875)
評論(5) 編輯 收藏 引用 所屬分類:
C/C++
當我第一次使用boost::serlization的時候,就意識到它在RMI(Remote method Invoke)的意義,因為JAVA RMI就是建立在java serlization的基礎(chǔ)之上。
先來個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傳過去,就可以實現(xiàn)RMI了。
當然這種方法只能是在C++程序之間傳遞。
今天在codeproject上面發(fā)現(xiàn)已經(jīng)有人已經(jīng)這樣做了,原來早就有人跟我有一樣的想法
看看作者封裝的結(jié)果吧
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