【发布时间】:2019-06-26 12:14:43
【问题描述】:
我通过 boost 编写了一个 websocket,并通过 chrome 客户端收到了消息。 当我使用 ws 时,它运行良好,我可以收到正确的消息。 但是当我使用 wss 时,它的效果很差,并且说无法将文本帧解码为 UTF 8。
c++ 发送消息代码
Json::Value jsonMsg;
jsonMsg["msgType"] = Json::Value("MspServiceStartUp");
jsonMsg["version"] = Json::Value(std::string(MSP_VERSION));
ws_->async_write(boost::asio::buffer((void *) jsonMsg.toStyledString().data(), jsonMsg.toStyledString().size()),
boost::asio::bind_executor(*strand_, [&, sp](boost::system::error_code ec1,
std::size_t bytes_transferred1) {
boost::ignore_unused(bytes_transferred1);
if (ec1) {
LOG_ERR << "async write failed, ec = " << ec1 << ", msg = "
<< ec1.message();
return;
}
// Clear the buffer
buffer_->consume(buffer_->size());
task();
}));
}
js代码
var ws=new WebSocket("wss://localhost.com:17801/");
ws.onopen=()=>{console.log('ws open')};
ws.onclose=()=>{console.log('ws close')};
ws.onmessage=(msg)=>{console.log('ws onMessage');console.log(msg)};
这个奇怪的角色是从哪里来的? 问题是什么?如何解决这个问题?
【问题讨论】:
-
我不明白它是如何工作的。首先
toStyledString按值返回字符串,所以data()你有悬空指针。其次,async_write立即返回,因此可以在发送消息之前销毁 jsonMsg。
标签: javascript google-chrome boost beast-websockets