#include "WebSocketServer.h" #include "Log.h" #include CWebSocketServer::CWebSocketServer() { // Set logging settings /*m_endpoint.set_error_channels(websocketpp::log::elevel::all);*/ /*m_endpoint.set_access_channels(websocketpp::log::alevel::all ^ websocketpp::log::alevel::frame_payload);*/ m_endpoint.set_access_channels(websocketpp::log::alevel::none ^ websocketpp::log::alevel::none); // Register our message handler m_endpoint.set_message_handler(bind(&CWebSocketServer::on_message, this, &m_endpoint, std::placeholders::_1, std::placeholders::_2)); m_endpoint.set_open_handler(bind(&CWebSocketServer::on_open, this, &m_endpoint, std::placeholders::_1)); m_endpoint.set_close_handler(bind(&CWebSocketServer::on_close, this, &m_endpoint, std::placeholders::_1)); m_endpoint.set_fail_handler(bind(&CWebSocketServer::on_fail, this, &m_endpoint, std::placeholders::_1)); m_endpoint.init_asio(); m_endpoint.set_reuse_addr(true); m_endpoint.start_perpetual(); } CWebSocketServer::~CWebSocketServer() { m_endpoint.stop_perpetual(); if (!m_endpoint.stopped()) { m_endpoint.stop(); } } bool CWebSocketServer::init(uint16_t port) { m_port = port; try { m_endpoint.listen(m_port); // Queues a connection accept operation m_endpoint.start_accept(); } catch (const std::exception& e) { LOG_ERROR_S(e.what()); return false; } return true; } bool CWebSocketServer::sendMsg(websocketpp::connection_hdl hdl, string msg) { try { websocketpp::frame::opcode::value op = websocketpp::frame::opcode::value::TEXT; m_endpoint.send(hdl, msg, op); LOG_INFO("消息发送到坐席成功,[%s]",msg.c_str()); } catch (websocketpp::exception const & e) { stringstream str; str << "Echo failed because: " << "(" << e.what() << ")"; LOG_ERROR_S(str.str()); LOG_ERROR("消息发送到坐席失败,[%s]", msg.c_str()); return false; } return true; } void CWebSocketServer::run() { // Start the Asio io_service run loop m_endpoint.run(); } void CWebSocketServer::close(websocketpp::connection_hdl hdl) { m_endpoint.close(hdl, websocketpp::close::status::normal, "123"); } void CWebSocketServer::stop() { if (!m_endpoint.stopped()) { m_endpoint.stop(); } } // Define a callback to handle incoming messages void CWebSocketServer::on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg) { string msgInfo; msgInfo = msg->get_payload(); stringstream str; str << "on_message called with hdl: " << hdl.lock().get() << " and message: " << msgInfo << s->get_con_from_hdl(hdl)->get_remote_endpoint(); LOG_DEBUG_S(str.str()); if (this->pRecvFun != nullptr) this->pRecvFun(hdl, msgInfo); // 收到消息回调函数 } void CWebSocketServer::on_open(server* s, websocketpp::connection_hdl hdl) { stringstream str; str << "on_open called with hdl: " << hdl.lock().get() << s->get_con_from_hdl(hdl)->get_remote_endpoint(); LOG_DEBUG_S(str.str()); } void CWebSocketServer::on_close(server* s, websocketpp::connection_hdl hdl) { stringstream str; str << "on_close called with hdl: " << hdl.lock().get() << s->get_con_from_hdl(hdl)->get_remote_endpoint(); LOG_DEBUG_S(str.str()); if (this->pCloseFun != nullptr) this->pCloseFun(hdl); // 连接断开回调函数 } void CWebSocketServer::on_fail(server* s, websocketpp::connection_hdl hdl) { stringstream str; str << "on_fail called with hdl: " << hdl.lock().get() << s->get_con_from_hdl(hdl)->get_remote_endpoint(); LOG_DEBUG_S(str.str()); }