#include "WebSocketServer.h" #include "Log.h" #include CWebSocketServer::CWebSocketServer() { } CWebSocketServer::~CWebSocketServer() { if (CConfig::GetInstance()->isWss()) { m_endpoint_tls.stop_perpetual(); if (!m_endpoint_tls.stopped()) { m_endpoint_tls.stop(); } } else { m_endpoint.stop_perpetual(); if (!m_endpoint.stopped()) { m_endpoint.stop(); } } } bool CWebSocketServer::init(uint16_t port) { m_port = port; try { if (CConfig::GetInstance()->isWss()) { printf("准备WSS\n"); m_endpoint_tls.set_access_channels(websocketpp::log::alevel::none ^ websocketpp::log::alevel::none); m_endpoint_tls.set_message_handler(bind(&CWebSocketServer::on_message, this, &m_endpoint_tls, std::placeholders::_1, std::placeholders::_2)); m_endpoint_tls.set_open_handler(bind(&CWebSocketServer::on_open, this, &m_endpoint_tls, std::placeholders::_1)); m_endpoint_tls.set_close_handler(bind(&CWebSocketServer::on_close, this, &m_endpoint_tls, std::placeholders::_1)); m_endpoint_tls.set_fail_handler(bind(&CWebSocketServer::on_fail, this, &m_endpoint_tls, std::placeholders::_1)); m_endpoint_tls.set_tls_init_handler(bind(&CWebSocketServer::on_tls_init, this, std::placeholders::_1)); m_endpoint_tls.init_asio(); m_endpoint_tls.set_reuse_addr(true); m_endpoint_tls.start_perpetual(); } else { printf("准备WS\n"); m_endpoint.set_access_channels(websocketpp::log::alevel::none ^ websocketpp::log::alevel::none); 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(); } if (CConfig::GetInstance()->isWss()) { m_endpoint_tls.listen(m_port); m_endpoint_tls.start_accept(); } else { m_endpoint.listen(m_port); 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; if (CConfig::GetInstance()->isWss()) { m_endpoint_tls.send(hdl, msg, op); } else { 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 if (CConfig::GetInstance()->isWss()) { m_endpoint_tls.run(); } else { m_endpoint.run(); } } void CWebSocketServer::close(websocketpp::connection_hdl hdl) { if (CConfig::GetInstance()->isWss()) { m_endpoint_tls.close(hdl, websocketpp::close::status::normal, "Normal"); } else { m_endpoint.close(hdl, websocketpp::close::status::normal, "Normal"); } } void CWebSocketServer::stop() { if (CConfig::GetInstance()->isWss()) { if (!m_endpoint_tls.stopped()) { m_endpoint_tls.stop(); } } else { if (!m_endpoint.stopped()) { m_endpoint.stop(); } } } // Define a callback to handle incoming messages template void CWebSocketServer::on_message(EndpointType* s, websocketpp::connection_hdl hdl, typename EndpointType::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); // 收到消息回调函数 } template void CWebSocketServer::on_open(EndpointType* 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()); } template void CWebSocketServer::on_close(EndpointType* 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); // 连接断开回调函数 } template void CWebSocketServer::on_fail(EndpointType* 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()); }