RpcChannel.cc 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <boost/asio.hpp>
  2. #include <boost/make_shared.hpp>
  3. #include <google/protobuf/message.h>
  4. #include "Net/RpcChannel.h"
  5. #include "Net/RpcCommunicator.h"
  6. namespace Hainan {
  7. RpcChannel::RpcChannel(std::string& host, int port):
  8. id(0)
  9. {
  10. // socket.async_connect(endpoint, );
  11. }
  12. void RpcCommunicator::SendRequestHandler(int32 id, RpcHandlerPtr handler,
  13. const boost::system::error_code& err)
  14. {
  15. if (err)
  16. {
  17. handler->GetController()->SetFailed("failed");
  18. }
  19. else
  20. {
  21. handlers[id] = handler;
  22. }
  23. }
  24. void RpcChannel::SendRequest(const RpcRequest& request, RpcHandlerPtr handler)
  25. {
  26. int size = request.ByteSize();
  27. std::stringstream ss;
  28. ss << size;
  29. ss << request.SerializeAsString();
  30. communicator.AsyncWrite(boost::asio::buffer(ss),
  31. boost::bind(&RpcChannel::SendRequestHandler, this, request.id(),
  32. handler, boost::asio::placeholders::error));
  33. }
  34. void RpcChannel::CallMethod(
  35. const google::protobuf::MethodDescriptor* method,
  36. google::protobuf::RpcController* controller,
  37. const google::protobuf::Message* request,
  38. google::protobuf::Message* response,
  39. google::protobuf::Closure* done) {
  40. RpcRequest req;
  41. req.set_id(++id);
  42. req.set_method(method->full_name());
  43. req.set_request(request->SerializeAsString());
  44. RpcHandlerPtr handler = boost::make_shared<RpcHandler>(
  45. controller, response, done);
  46. SendRequest(req, handler);
  47. }
  48. } // namespace Hainan