RpcServer.cc 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <boost/asio.hpp>
  2. #include <boost/foreach.hpp>
  3. #include "Base/Base.h"
  4. #include "Net/RpcServer.h"
  5. #include "Net/RpcSession.h"
  6. #include "Thread/ThreadPool.h"
  7. namespace Hainan {
  8. RpcServer::RpcServer(google::protobuf::Service& pservice, int port):
  9. service(pservice), io_service(), thread_pool()
  10. {
  11. boost::asio::ip::address address;
  12. address.from_string("localhost");
  13. boost::asio::ip::tcp::endpoint endpoint(address, port);
  14. acceptor.open(endpoint.protocol());
  15. acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
  16. acceptor.bind(endpoint);
  17. acceptor.listen();
  18. RpcSessionPtr new_session(new RpcSession(sessions));
  19. acceptor.async_accept(new_session->socket(),
  20. boost::bind(&RpcServer::HandleAsyncAccept, this,
  21. boost::asio::placeholders::error));
  22. }
  23. void RpcServer::HandleAsyncAccept(RpcSessionPtr session, const boost::system::error_code& err)
  24. {
  25. if (err)
  26. {
  27. return;
  28. }
  29. session->Start();
  30. sessions.insert(session);
  31. RpcSessionPtr new_session(new RpcSession(io_service, sessions));
  32. acceptor.async_accept(new_session->socket(),
  33. boost::bind(&RpcServer::HandleAsyncAccept, this,
  34. boost::asio::placeholders::error));
  35. }
  36. void RpcServer::RunService(boost::asio::ip::tcp::socket& socket, RpcRequestPtr request)
  37. {
  38. }
  39. void RpcServer::Start()
  40. {
  41. io_service.run();
  42. }
  43. void RpcServer::Stop()
  44. {
  45. acceptor.close();
  46. foreach(RpcSessionPtr session, rpc_server->sessions)
  47. {
  48. session->stop();
  49. }
  50. sessions.clear();
  51. }
  52. } // namespace Hainan