如何通过 WebSocket 将二进制数据从 Node.js 发送到网页?

Jas*_*son 5 websocket node.js

我尝试过以几种不同的方式发送 Float32Array 和 ArrayBuffer 但我在客户端收到的缓冲区总是看起来是空的。我应该如何发送数据?我怎样才能访问它?

\n\n

这是我的最新尝试:

\n\n

服务器.js

\n\n
const WebSocket = require(\'ws\');\n\nconst wss = new WebSocket.Server({ port: 8000 });\n\nwss.on(\'connection\', function connection(ws) {\n\n    var arr1 = new Float32Array(4);\n    for (var i = 0; i < arr1.length; ++i)\n        arr1[i] = (i + 100) / 7;\n\n//    ws.send(arr1.buffer);\n\n\n    var arr2 = new ArrayBuffer(8);\n    for(var i = 0; i < 8; i++)\n        arr2[i] = i * 17;\n\n    ws.send(arr2);    \n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

客户端.html

\n\n
<!DOCTYPE html>\n<html>\n<head></head>\n<body>\n\n<script>\n\nvar gData = null;\n\nvar ws = new WebSocket("ws://192.168.0.7:8000");\nws.binaryType = \'arraybuffer\';\n\nws.onmessage = function(message) {\n    console.log(message.data);\n    gData = message.data;\n};\n\n</script>\n\n</body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

控制台输出

\n\n
ArrayBuffer(8)\xc2\xa0{}\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,只是因为我很好奇,如何将二进制数据发送回服务器?

\n

Der*_*rzu 2

您需要创建 WebSocket 并将其类型设置为arraybuffer( binaryType = 'arraybuffer')。我认为您在服务器端忘记了这一点。

在此示例中,字节是从 Base64 字符串信息中获取的。

    // /sf/ask/1525810961/
    function base64ToArrayBuffer(base64) {
        var binary_string = Buffer.from(base64, 'base64').toString('binary');
        var len = binary_string.length;
        var bytes = new Uint8Array(len);
        for (var i = 0; i < len; i++) {
            bytes[i] = binary_string.charCodeAt(i);
        }    

        return bytes.buffer;
    }

    // websocket server
    const WebSocket = require("ws"); // websocket server
    const wss = new WebSocket.Server({ port: 8082 });
    console.log("WebSocket Server Started on port 8082");

    wss.binaryType = 'arraybuffer';
    const content_base64 = "c3RyZWFtIGV2ZW50"; // Place your base64 content here.
    const binaryData = base64ToArrayBuffer(content_base64);

    wss.on("connection", (ws) => {
        console.log("WebSocket sending msg");
        ws.send(binaryData);
    });
Run Code Online (Sandbox Code Playgroud)

不要忘记通过命令安装 npm websocket 模块:

$ npm install websocket
Run Code Online (Sandbox Code Playgroud)