RpcClient.cc 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <boost/asio.hpp>
  2. #include <boost/bind.hpp>
  3. #include <google/protobuf/message.h>
  4. #include <google/protobuf/descriptor.h>
  5. #include "Rpc/RpcCommunicator.h"
  6. #include "Rpc/RpcClient.h"
  7. #include "Rpc/RequestHandler.h"
  8. namespace Egametang {
  9. RpcClient::RpcClient(boost::asio::io_service& ioService, std::string host, int port):
  10. RpcCommunicator(ioService), id(0)
  11. {
  12. // another thread?
  13. boost::asio::ip::address address;
  14. address.from_string(host);
  15. boost::asio::ip::tcp::endpoint endpoint(address, port);
  16. socket.async_connect(endpoint,
  17. boost::bind(&RpcClient::OnAsyncConnect, this,
  18. boost::asio::placeholders::error));
  19. }
  20. RpcClient::~RpcClient()
  21. {
  22. }
  23. void RpcClient::OnAsyncConnect(const boost::system::error_code& err)
  24. {
  25. if (err)
  26. {
  27. return;
  28. }
  29. RpcMetaPtr recvMeta(new RpcMeta());
  30. StringPtr recvMessage(new std::string);
  31. RecvMeta(recvMeta, recvMessage);
  32. }
  33. void RpcClient::OnRecvMessage(RpcMetaPtr meta, StringPtr message)
  34. {
  35. // 没有回调
  36. if (requestHandlers.find(meta->id) == requestHandlers.end())
  37. {
  38. // meta和message可以循环利用
  39. RecvMeta(meta, message);
  40. }
  41. else
  42. {
  43. RequestHandlerPtr requestHandler = requestHandlers[meta->id];
  44. requestHandlers.erase(meta->id);
  45. requestHandler->Response()->ParseFromString(*message);
  46. // meta和message可以循环利用
  47. RecvMeta(meta, message);
  48. // 回调放在函数最.如果RecvMeta()放在回调之后,
  49. // 另外线程可能让io_service stop,导致RecvMeta还未跑完
  50. // 网络就终止了
  51. requestHandler->Run();
  52. }
  53. }
  54. void RpcClient::OnSendMessage(RpcMetaPtr meta, StringPtr message)
  55. {
  56. }
  57. void RpcClient::CallMethod(
  58. const google::protobuf::MethodDescriptor* method,
  59. google::protobuf::RpcController* controller,
  60. const google::protobuf::Message* request,
  61. google::protobuf::Message* response,
  62. google::protobuf::Closure* done)
  63. {
  64. if (!done)
  65. {
  66. RequestHandlerPtr request_handler(new RequestHandler(response, done));
  67. requestHandlers[++id] = request_handler;
  68. }
  69. boost::hash<std::string> stringHash;
  70. StringPtr message(new std::string);
  71. request->SerializePartialToString(message.get());
  72. RpcMetaPtr meta(new RpcMeta());
  73. meta->size = message->size();
  74. meta->id = id;
  75. meta->method = stringHash(method->full_name());
  76. SendMeta(meta, message);
  77. }
  78. } // namespace Egametang