我通过http-server获得主线程,而通过Websocketpp客户端获得后台线程,该线程必须将消息发送到Websocket服务器。我尝试从主线程发送一些数据,并将其用于全局变量。看起来像:
全局变量:
extern client* SendClient; //for sending message
extern websocketpp::connection_hdl hdlSend;
extern nlohmann::json Result; //for get result
WebSocket:
void on_open(client* c, websocketpp::connection_hdl hdl, std::string sid, std::string type, std::string streamName) {
std::cout << "SET CONNECTION TO STREAM " << std::endl;
hdlSend = hdl;
SendClient = c;
std::string resp = "Start";
c->send(hdl, resp, websocketpp::frame::opcode::text);
}
void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg, std::string sid, std::string types) {
std::string GetMess = msg->get_payload();
function FUNC;
if (DEBUG == true)
FUNC.make_log("DEBUG", "Get Mess: " + GetMess, false);
Result.clear();
try {
Result = nlohmann::json::parse(GetMess);
}
catch (nlohmann::json::parse_error e) {
Result["code"] = -1;
}
websocketpp::lib::error_code ec;
if (ec) {
std::cout << "Echo failed because: " << ec.message() << std::endl;
}
}
run()
{
std::string uri = "wss://0.0.0.0:4477/";
client c;
try {
c.set_access_channels(websocketpp::log::alevel::all);
c.clear_access_channels(websocketpp::log::alevel::frame_payload);
c.init_asio();
c.set_tls_init_handler(bind(&on_tls_init));
c.set_message_handler(bind(&on_message, &c, ::_1, ::_2, sid, type));
c.set_open_handler(bind(&on_open, &c, ::_1, sid, type, streamName));
c.set_close_handler(bind(&on_close, &c, ::_1, type, sid));
websocketpp::lib::error_code ec;
client::connection_ptr con = c.get_connection(uri, ec);
if (ec) {
std::cout << "could not create connection because: " << ec.message() << std::endl;
}
c.connect(con);
c.run();
}
和测试代码。我在线程中调用WebSocket服务器-> sleep等待连接,然后发送2条消息
std::thread CachingTh(CachingRun);
CachingTh.detach(); // send WebSocket to background thread
SendClient->get_con_from_hdl(hdlSend)->send("Start", websocketpp::frame::opcode::text); // Send hello, server must return "Start"
nlohmann::json Send;
Send["type"] = "Setint";
Send["key"] = "test";
Send["value"] = "test";
SendClient->get_con_from_hdl(hdlSend)->send(Send.dump(), websocketpp::frame::opcode::text); // Send json, server must return "is_ok"
std::cout << "Result: " << Result.dump() << std::endl; // get result
std::cout << "**********************" << std::endl;
此后,我得到:
Get Mess: Start
Get Mess: is_ok
CachResult: Start
但必须为:
Get Mess: Start
Get Mess: is_ok
CachResult: is_ok
然后我如何理解客户端必须等待WebSocket服务器的答复。您能帮我,如何正确执行上述任务?谢谢!