javascript - 数据通过 websocketpp 返回为 json,但通过 messagepack 返回为 Blob

标签 javascript c++ json c++11 websocket

这很奇怪。我使用用 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/

相关文章:

c++ - Arduino,将 jsonBuffer.parseObject 的返回传递给函数

android - 从内部存储中读取 JSON 文件的内容

javascript - 为什么全局范围内的变量被分配给 window 对象?

javascript - 我正在尝试制作一个discord.js头像命令,并且提到的部分无法正常工作

c++ - 使用 g++ 的 clang/llvm 链接失败

C++ 模板名称 : compilation error in Visual Studio, 在 gcc 中工作正常

java - 如何在JAVA中读取python字典字符串

javascript - 谷歌地图 - map 未加载

javascript - 在 ASP.NET 中打印由分页符分隔的所有页面

C++ 赋值给隐式转换的左值