當(dāng)我第一次使用boost::serlization的時(shí)候,就意識(shí)到它在RMI(Remote method Invoke)的意義,因?yàn)镴AVA RMI就是建立在java serlization的基礎(chǔ)之上。
先來(lái)個(gè)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序列化以后通過(guò)socket傳過(guò)去,就可以實(shí)現(xiàn)RMI了。
當(dāng)然這種方法只能是在C++程序之間傳遞。
今天在codeproject上面發(fā)現(xiàn)已經(jīng)有人已經(jīng)這樣做了,原來(lái)早就有人跟我有一樣的想法
看看作者封裝的結(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;
}
比較簡(jiǎn)潔,利用了boost強(qiáng)大的function,thread,serlization
RCF下載地址:
http://www.codeproject.com/threads/RMI_For_Cpp/RCF.zip介紹:
http://www.codeproject.com/threads/RMI_For_Cpp.asp