【问题标题】:How can I exchange binary data between Node.js WebSocket server and C# client?如何在 Node.js WebSocket 服务器和 C# 客户端之间交换二进制数据?
【发布时间】:2017-09-07 10:49:40
【问题描述】:

我有带有Best HTTP asset 的 Node.js WebSocket 服务器和 Unity 客户端。 以前是传JSON数据,但是解析占用CPU资源太多。 现在,我尝试从 C# 发送 byte[] 消息,如下所示:

//sending sample array - new float[] { 1.32, 3.12 }
//convert an object to a byte array
private byte[] ObjectToByteArray(Object obj)
{
    if(obj == null)
       return null;

    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);

    return ms.ToArray(); 
}

但是服务器收到了 Uint8Array [1, 3] 并且小数部分丢失了。

var wss = new WebSocket.Server({ port: 8080 });
wss.binaryType = "arraybuffer";
wss.on('connection', function connection(ws) {
    ws.on('message', function (message) {
    });
});

主要问题:如何正确解析二进制格式的数组(尤其是嵌套数组)并编码为数组?

【问题讨论】:

    标签: c# node.js websocket arraybuffer uint8array


    【解决方案1】:

    你可以试试二进制 json BSON http://bsonspec.org/implementations.html

    或MSGPACK http://msgpack.org/index.html

    这两个库都提供了多种语言的实现,并且经过了很好的测试。

    【讨论】:

    • 我读到了 Node.js 中的 BSON 解析器,它的运行速度比 JSON 慢得多。在编码/解码传输数据时,我需要减少服务器端的 CPU 负载 - 它的主要目标。
    • 从您的角度来看,为什么编写的解析/写入速度比 json 更快的东西实际上更慢?如果您来回交换的数据很大或者是嵌套的,那么可能是问题所在。
    • JSON 解码/编码可能在本地代码中以优化方式直接在 JS VM 中实现。是的,我传递了几个嵌套数组
    【解决方案2】:

    正常的二进制序列化可能是 Web API 的瓶颈 如果您的对象定义明确并且可以建模为类,我建议您使用Protobuf。

    很棒的是它是跨平台的,您可以对 NodeJS 服务器和 C# 客户端使用相同的定义。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2016-05-21
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2013-02-09
      • 2018-09-14
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多