项目地址:http://code.google.com/p/febird
目前已经全部完成,并且取得了非常好的效果 。
使用该RPC的简短代码:
//////////////////////////////////////////////////////////////////////////
// sample usage...
// test.h
namespace febird { namespace rpc {
//////////////////////////////////////////////////////////////////////////
// sample usage...
// test.h
class SampleRPC_Interface1 : public remote_object
{
public:
typedef std::vector<var_uint32_t> vint_vec;
BEGIN_RPC_REGISTER_MF(SampleRPC_Interface1)
RPC_REGISTER_MF(get_val)
RPC_REGISTER_MF(get_len)
RPC_REGISTER_MF(squareVec)
RPC_REGISTER_MF(multiVec)
END_RPC_REGISTER_MF()
RPC_DECLARE_MF ( get_val , ( rpc_in < int > x ))
RPC_DECLARE_MF(get_len, (const std::string& x))
RPC_DECLARE_MF(squareVec, (vint_vec& x))
RPC_DECLARE_MF(multiVec, (vint_vec& z, vint_vec& x, vint_vec& y))
#ifdef RPC_CLIENT_SIDE
void printVec(const vint_vec& vec);
#endif
};
class SampleRPC_Interface2 : public remote_object
{
public:
BEGIN_RPC_REGISTER_MF(SampleRPC_Interface2)
RPC_REGISTER_MF(get_val)
RPC_REGISTER_MF(get_len)
END_RPC_REGISTER_MF()
RPC_DECLARE_MF ( get_val , ( rpc_in < int > x ))
RPC_DECLARE_MF(get_len, (const std::string& x))
};
} } // namespace febird::rpc
// server.cpp
// test_rpc_server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <tlib/rpc/server.h>
#include <tlib/io/SocketStream.h>
#include <iostream>
#include "../test.h"
namespace febird { namespace rpc {
rpc_return_t SampleRPC_Interface1::get_val(rpc_in<int> x)
{
std::cout << "SampleRPC_Interface1::get_val(rpc_in<int> x=" << x.get() << ")\n";
return x.get();
}
rpc_return_t SampleRPC_Interface1::get_len(const std::string& x)
{
std::cout << "SampleRPC_Interface1::get_len(const std::string& x=\"" << x << "\")\n";
return x.size();
}
rpc_return_t SampleRPC_Interface1::squareVec(vint_vec& x)
{
for (vint_vec::iterator i = x.begin(); i != x.end(); ++i)
{
(*i).t *= (*i).t;
}
return x.size();
}
rpc_return_t SampleRPC_Interface1::multiVec(vint_vec& z, vint_vec& x, vint_vec& y)
{
z.clear();
for (int i = 0; i < x.size(); ++i)
{
z.push_back(var_uint32_t(x[i].t * y[i].t));
}
return 123456;
}
rpc_return_t SampleRPC_Interface2::get_val(rpc_in<int> x)
{
std::cout << BOOST_CURRENT_FUNCTION << "x=" << x.get() << "\n";
return x.get();
}
rpc_return_t SampleRPC_Interface2::get_len(const std::string& x)
{
std::cout << BOOST_CURRENT_FUNCTION << "x=" << x << "\n";
return x.size();
}
} } // namespace febird::rpc
using namespace febird;
using namespace febird::rpc;
typedef SocketStream stream_t;
typedef PortableDataInput <BufferedInputStream> input_t;
typedef PortableDataOutput<BufferedOutputStream> output_t;
int main(int argc, char** argv[])
{
#ifdef _WIN32
WSADATA information;
WSAStartup(MAKEWORD(2, 2), &information);
#endif
rpc_server<input_t, output_t, SocketConnection> server;
server.listen("0.0.0.0:8001");
// register rpc implementation class...
项目地址:http://code.google.com/p/febird