Как отправить массив буфера в двоичном виде через Websocket? - PullRequest
21 голосов
/ 03 марта 2012

Я работаю над проектом с Mozilla Europe. В этом проекте я использую websocket от Worlize (на стороне сервера) и Mozilla (на стороне клиента), Node.js, чтобы попытаться загрузить файлы с клиента на сервер.
Моя нынешняя цель - отправить arraybuffer файла на сервер. Создайте массив буферов и отправьте его нормально.
Но мой сервер говорит мне, что arraybuffer - это сообщение utf8, а не двоичное сообщение.

Я что-то не так понимаю? Если нет, как я могу это исправить?

Клиентская сторона:

    reader = new FileReader();
    reader.readAsArrayBuffer(file);
    reader.onload = function(e) {
        connection.send(e.target.result); 
    };

Сторона сервера:

ws.on('message', function(message,flags) {
if (!flags.binary) {
    //some code
}
else {
    console.log('It\'s a binary');
}

Я тоже пытаюсь с Blob, тот же результат. Двоичная часть невидима.

Ответы [ 2 ]

23 голосов
/ 11 июля 2012

Gecko11.0 ArrayBuffer реализована поддержка отправки и получения двоичных данных.

connection = new WebSocket('ws://localhost:1740');
connection.binaryType = "arraybuffer";
connection.onopen = onopen;
connection.onmessage = onmessage;
connection.onclose = onclose;
connection.onerror = onerror;

отправка двоичных данных:

function sendphoto() {
    imagedata = context.getImageData(0, 0, imagewidth,imageheight);

    var canvaspixelarray = imagedata.data;


    var canvaspixellen = canvaspixelarray.length;
    var bytearray = new Uint8Array(canvaspixellen);

    for (var i=0;i<canvaspixellen;++i) {
        bytearray[i] = canvaspixelarray[i];
    }

    connection.send(bytearray.buffer);
    context.fillStyle = '#ffffff';
    context.fillRect(0, 0, imagewidth,imageheight);    
}

получение двоичных данных:

if(event.data instanceof ArrayBuffer)
    {

        var bytearray = new Uint8Array(event.data);


        var tempcanvas = document.createElement('canvas');
            tempcanvas.height = imageheight;
            tempcanvas.width = imagewidth;
        var tempcontext = tempcanvas.getContext('2d');

        var imgdata = tempcontext.getImageData(0,0,imagewidth,imageheight);

        var imgdatalen = imgdata.data.length;

        for(var i=8;i<imgdatalen;i++)
        {
            imgdata.data[i] = bytearray[i];
        }

        tempcontext.putImageData(imgdata,0,0);


        var img = document.createElement('img');
            img.height = imageheight;
            img.width = imagewidth;
            img.src = tempcanvas.toDataURL();
        chatdiv.appendChild(img);
        chatdiv.innerHTML = chatdiv.innerHTML + "<br />";
    }
1 голос
/ 05 апреля 2012
Note: Prior to version 11, Firefox only supported sending data as a string.

Источник: https://developer.mozilla.org/en/WebSockets/Writing_WebSocket_client_applications

...