这很奇怪。我使用用 C++ 编写的 websocketpp 修改了一个 websocket-server 示例。它使用 nlohmann/json 解析来自客户端的传入字符串化 json 数据。数据以 json 格式返回给客户端,解析并更新一个 hmtl div。到目前为止一切正常。
然后我想使用消息包压缩来自客户端的 json 数据,解析并以相同的 json 格式返回它,但现在我得到一个错误,因为数据现在是 [object Blob]。我打开了 wireshark,但它们在两种情况下捕获的信息完全相同。
两者都返回为
${"cnt":4,"data":"test","type":"msg"}
长度为 38。
在 chrome 中我得到了错误
Uncaught SyntaxError: Unexpected token o
添加消息包之前的客户端如下:
function sendMessage () {
var m = document.getElementById("messageField").value;
var msg = {
"type": "msg",
"data": m
}
msg = JSON.stringify(msg);
ws.send(msg);
}
以及添加消息包前的C++服务器:
void on_message(connection_hdl hdl, server::message_ptr msg) {
connection_ptr con = m_server.get_con_from_hdl(hdl);
std::string payload = msg->get_payload();
try {
auto jdata = nlohmann::json::parse(payload);
if (jdata["type"] == "lgn") {
std::string lname = jdata["data"];
if (con->name == "") {
con->name = lname;
}
}
if (jdata["type"] == "msg") {
std::string clientmsg = jdata["data"];
jdata["cnt"] = clientmsg.length();
msg->set_payload(jdata.dump());
m_server.send(hdl, msg);
}
} catch (const std::exception& e) {
msg->set_payload("Unable to parse json");
m_server.send(hdl, msg);
std::cerr << "Unable to parse json: " << e.what() << std::endl;
}
}
非常基础。添加消息包后的客户端和服务端如下:
function sendMessage () {
var m = document.getElementById("messageField").value;
var msg = {
"type": "msg",
"data": m
}
msg = JSON.stringify(msg);
var buffer = msgpack.encode(msg);
ws.send(buffer);
}
只添加
var buffer = msgpack.encode(msg);
并相应地更改 ws.send()。
void on_message(connection_hdl hdl, server::message_ptr msg) {
connection_ptr con = m_server.get_con_from_hdl(hdl);
std::string payload = msg->get_payload();
// Parse messagepack
msgpack::unpacked unpacked_msg;
msgpack::unpack(&unpacked_msg, payload.data(), payload.size());
msgpack::object obj = unpacked_msg.get();
std::string sobj;
obj.convert(&sobj);
try {
auto jdata = nlohmann::json::parse(sobj);
if (jdata["type"] == "lgn") {
std::string lname = jdata["data"];
if (con->name == "") {
con->name = lname;
}
}
if (jdata["type"] == "msg") {
std::string clientmsg = jdata["data"];
jdata["cnt"] = clientmsg.length();
msg->set_payload(jdata.dump());
m_server.send(hdl, msg);
}
} catch (const std::exception& e) {
msg->set_payload("Unable to parse json");
m_server.send(hdl, msg);
std::cerr << "Unable to parse json: " << e.what() << std::endl;
}
}
添加
// Parse messagepack
msgpack::unpacked unpacked_msg;
msgpack::unpack(&unpacked_msg, payload.data(), payload.size());
msgpack::object obj = unpacked_msg.get();
std::string sobj;
obj.convert(&sobj);
并相应地更改 nlohmann::json::parse()。
奇怪的是我只使用messagepack atm。压缩传入的 json 数据但不压缩。如果这个问题得到解决,我将同时使用它。一定有什么我忽略了,感谢帮助。
最佳答案
也许为时已晚,但 nlohmann/json 现在也支持 MessagePack,因此您可能不需要为 MessagePack 编码使用特殊的库。参见 https://github.com/nlohmann/json#binary-formats-cbor-and-messagepack例如。
关于javascript - 数据通过 websocketpp 返回为 json,但通过 messagepack 返回为 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33450913/