我该如何从Node.js通过WebSocket向网页发送二进制数据?

4
我可以帮你翻译成中文。这段内容涉及到IT技术,发送Float32Array和ArrayBuffer的方式不同,但是接收方始终感觉缓冲区是空的。您应该如何发送数据? 如何访问它?
以下是我最新的尝试:
server.js
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8000 });

wss.on('connection', function connection(ws) {

    var arr1 = new Float32Array(4);
    for (var i = 0; i < arr1.length; ++i)
        arr1[i] = (i + 100) / 7;

//    ws.send(arr1.buffer);


    var arr2 = new ArrayBuffer(8);
    for(var i = 0; i < 8; i++)
        arr2[i] = i * 17;

    ws.send(arr2);    
});

client.html

<!DOCTYPE html>
<html>
<head></head>
<body>

<script>

var gData = null;

var ws = new WebSocket("ws://192.168.0.7:8000");
ws.binaryType = 'arraybuffer';

ws.onmessage = function(message) {
    console.log(message.data);
    gData = message.data;
};

</script>

</body>
</html>

控制台输出

ArrayBuffer(8) {}

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

Jason,你解决了这个问题吗? - Derzu
@Derzu 我记不清了,但我想emax的回答(下面)已经帮了我很多。 - Jason
2个回答

2
你需要创建WebSocket并将其类型设置为arraybufferbinaryType = 'arraybuffer')。我认为你在服务器端忘记了这个步骤。
在这个示例中,字节是从base64字符串信息中获取的。
    // https://dev59.com/mmEh5IYBdhLWcg3w_Xv5
    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);
    });

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

$ npm install websocket

1

ArrayBuffer就是一个缓冲区,在访问缓冲区中的内存时,需要使用view

var arr2 = new ArrayBuffer(8);
var view = new Uint8Array(arr2);
for(var i = 0; i < 8; i++)
    view[i] = i * 17;
ws.send(arr2);  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接