2014-10-21 3 views
5

Я пытаюсь отправить буфер в мой браузер через socket.io. Предположительно это поддерживается с 1.0.Проблема с отправкой буфера через Socket.IO

Серверный код:

var tempBuffer = new Buffer(10); 
for (var i=0; i<10; i++) { 
    tempBuffer[i] = i; 
} 
io.sockets.emit('updateDepth', { image: true, buffer: tempBuffer }); 

код клиента:

socket.on('updateDepth', function(data) { 
    console.log("update depth: " + data.buffer + ", " + data.buffer.length); 
}); 

Все выглядит хорошо на стороне клиента, за исключением того, что data.buffer является ArrayBuffer (не буфер), а длина не определена (ArrayBuffer, похоже, ничего не содержит).

Я пропустил что-то очевидное или это не то, как он должен работать? Большое спасибо!

+1

Оперативник вопрос, является ли 'socket.io' действительно оборудован для обработки отправки и получения бинарных данных? В примерах, которые я видел, всегда были строки или JSON (другие вещи превратились в строку), но я не знаю, какие возможности «socket.io» в этом отношении. – jfriend00

+1

Вы не можете отправить двоичный буфер через сокет io. Взгляните на [BinaryJS] (http://binaryjs.com/) –

+0

Вы можете base64 закодировать свой буфер и отправить эту строку. – jfriend00

ответ

1

Buffer - это узел, для которого браузеры не имеют встроенной поддержки, но они поддерживают типизированные массивы (лучше, чем буферная прокладка). Поэтому имеет смысл использовать лучший контейнер на стороне браузера.

+0

И, как именно вы предлагаете отправить типизированный массив, если 'socket.io' не принимает двоичные данные? – jfriend00

+0

Socket.IO 1.x поддерживает двоичные данные. – mscdex

+0

Ссылка пожалуйста. – jfriend00

3

Оказалось, что это работает нормально. По какой-то причине буфер не позволял мне получить доступ к нему напрямую, и длина была неопределенной. Однако преобразование его в Uint8Array отлично работало. Я предполагаю, что это связано с тем, что, хотя socket.io теперь отправит объекты Buffer, нет никакой гарантии, что ваш клиентский javascript будет знать, что с ними делать.

Это делает работу:

socket.on('updateImg', function(data) { 
    var imgArray = new Uint8Array(data.buffer); 
    console.log("update img: " + data.buffer + ", " + data.buffer.length); 
}); 
Смежные вопросы