linux版本中间件

WebSocketServer.cpp 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. }
  17. CWebSocketServer::~CWebSocketServer()
  18. {
  19. m_endpoint.stop();
  20. }
  21. bool CWebSocketServer::init(uint16_t port)
  22. {
  23. m_port = port;
  24. try
  25. {
  26. m_endpoint.listen(m_port);
  27. // Queues a connection accept operation
  28. m_endpoint.start_accept();
  29. }
  30. catch (const std::exception& e)
  31. {
  32. LOG_ERROR_S(e.what());
  33. return false;
  34. }
  35. return true;
  36. }
  37. bool CWebSocketServer::sendMsg(websocketpp::connection_hdl hdl, string msg)
  38. {
  39. try
  40. {
  41. websocketpp::frame::opcode::value op = websocketpp::frame::opcode::value::TEXT;
  42. m_endpoint.send(hdl, msg, op);
  43. }
  44. catch (websocketpp::exception const & e) {
  45. stringstream str;
  46. str << "Echo failed because: "
  47. << "(" << e.what() << ")";
  48. LOG_ERROR_S(str.str());
  49. return false;
  50. }
  51. return true;
  52. }
  53. void CWebSocketServer::run()
  54. {
  55. // Start the Asio io_service run loop
  56. m_endpoint.run();
  57. }
  58. void CWebSocketServer::close(websocketpp::connection_hdl hdl)
  59. {
  60. m_endpoint.close(hdl, websocketpp::close::status::normal, "123");
  61. }
  62. void CWebSocketServer::stop()
  63. {
  64. m_endpoint.stop();
  65. }
  66. // Define a callback to handle incoming messages
  67. void CWebSocketServer::on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg)
  68. {
  69. string msgInfo;
  70. msgInfo = msg->get_payload();
  71. stringstream str;
  72. str << "on_message called with hdl: " << hdl.lock().get()
  73. << " and message: " <<
  74. msgInfo << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  75. LOG_DEBUG_S(str.str());
  76. if (this->pRecvFun != nullptr)
  77. this->pRecvFun(hdl, msgInfo); // 收到消息回调函数
  78. }
  79. void CWebSocketServer::on_open(server* s, websocketpp::connection_hdl hdl) {
  80. stringstream str;
  81. str << "on_open called with hdl: " << hdl.lock().get()
  82. << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  83. LOG_DEBUG_S(str.str());
  84. }
  85. void CWebSocketServer::on_close(server* s, websocketpp::connection_hdl hdl) {
  86. stringstream str;
  87. str << "on_close called with hdl: " << hdl.lock().get()
  88. << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  89. LOG_DEBUG_S(str.str());
  90. if (this->pCloseFun != nullptr)
  91. this->pCloseFun(hdl); // 连接断开回调函数
  92. }
  93. void CWebSocketServer::on_fail(server* s, websocketpp::connection_hdl hdl)
  94. {
  95. stringstream str;
  96. str << "on_fail called with hdl: " << hdl.lock().get()
  97. << s->get_con_from_hdl(hdl)->get_remote_endpoint();
  98. LOG_DEBUG_S(str.str());
  99. }