linux版本中间件

WebSocketServer - 副本.cpp 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "WebSocketServer.h"
  2. #include "Log.h"
  3. #include <json/json.h>
  4. CWebSocketServer::CWebSocketServer()
  5. {
  6. // Set logging settings
  7. /*m_endpoint.set_error_channels(websocketpp::log::elevel::all);*/
  8. /*m_endpoint.set_access_channels(websocketpp::log::alevel::all ^ websocketpp::log::alevel::frame_payload);*/
  9. m_endpoint.set_access_channels(websocketpp::log::alevel::none ^ websocketpp::log::alevel::none);
  10. // Register our message handler
  11. m_endpoint.set_message_handler(bind(&CWebSocketServer::on_message, this, &m_endpoint, std::placeholders::_1, std::placeholders::_2));
  12. m_endpoint.set_open_handler(bind(&CWebSocketServer::on_open, this, &m_endpoint, std::placeholders::_1));
  13. m_endpoint.set_close_handler(bind(&CWebSocketServer::on_close, this, &m_endpoint, std::placeholders::_1));
  14. m_endpoint.set_fail_handler(bind(&CWebSocketServer::on_fail, this, &m_endpoint, std::placeholders::_1));
  15. m_endpoint.init_asio();
  16. m_endpoint.set_reuse_addr(true);
  17. m_endpoint.start_perpetual();
  18. }
  19. CWebSocketServer::~CWebSocketServer()
  20. {
  21. m_endpoint.stop_perpetual();
  22. if (!m_endpoint.stopped()) {
  23. m_endpoint.stop();
  24. }
  25. }
  26. bool CWebSocketServer::init(uint16_t port)
  27. {
  28. m_port = port;
  29. try
  30. {
  31. m_endpoint.listen(m_port);
  32. // Queues a connection accept operation
  33. m_endpoint.start_accept();
  34. }
  35. catch (const std::exception& e)
  36. {
  37. LOG_ERROR_S(e.what());
  38. return false;
  39. }
  40. return true;
  41. }
  42. bool CWebSocketServer::sendMsg(websocketpp::connection_hdl hdl, string msg)
  43. {
  44. try
  45. {
  46. websocketpp::frame::opcode::value op = websocketpp::frame::opcode::value::TEXT;
  47. m_endpoint.send(hdl, msg, op);
  48. LOG_INFO("消息发送到坐席成功,[%s]",msg.c_str());
  49. }
  50. catch (websocketpp::exception const & e) {
  51. stringstream str;
  52. str << "Echo failed because: "
  53. << "(" << e.what() << ")";
  54. LOG_ERROR_S(str.str());
  55. LOG_ERROR("消息发送到坐席失败,[%s]", msg.c_str());
  56. return false;
  57. }
  58. return true;
  59. }
  60. void CWebSocketServer::run()
  61. {
  62. // Start the Asio io_service run loop
  63. m_endpoint.run();
  64. }
  65. void CWebSocketServer::close(websocketpp::connection_hdl hdl)
  66. {
  67. m_endpoint.close(hdl, websocketpp::close::status::normal, "123");
  68. }
  69. void CWebSocketServer::stop()
  70. {
  71. if (!m_endpoint.stopped()) {
  72. m_endpoint.stop();
  73. }
  74. }
  75. // Define a callback to handle incoming messages
  76. void CWebSocketServer::on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg)
  77. {
  78. string msgInfo;
  79. msgInfo = msg->get_payload();
  80. stringstream str;
  81. str << "on_message called with hdl: " << hdl.lock().get()
  82. << " and message: " <<
  83. msgInfo << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  84. LOG_DEBUG_S(str.str());
  85. if (this->pRecvFun != nullptr)
  86. this->pRecvFun(hdl, msgInfo); // 收到消息回调函数
  87. }
  88. void CWebSocketServer::on_open(server* s, websocketpp::connection_hdl hdl) {
  89. stringstream str;
  90. str << "on_open called with hdl: " << hdl.lock().get()
  91. << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  92. LOG_DEBUG_S(str.str());
  93. }
  94. void CWebSocketServer::on_close(server* s, websocketpp::connection_hdl hdl) {
  95. stringstream str;
  96. str << "on_close called with hdl: " << hdl.lock().get()
  97. << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  98. LOG_DEBUG_S(str.str());
  99. if (this->pCloseFun != nullptr)
  100. this->pCloseFun(hdl); // 连接断开回调函数
  101. }
  102. void CWebSocketServer::on_fail(server* s, websocketpp::connection_hdl hdl)
  103. {
  104. stringstream str;
  105. str << "on_fail called with hdl: " << hdl.lock().get()
  106. << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  107. LOG_DEBUG_S(str.str());
  108. }