用C++的高级模版特性实现一个不需要IDL的RPC

项目地址: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

 

你可能感兴趣的:(C++,c,C#,Google)