отправка объекта javascript через websockets с помощью faye

Привет всем, я пытаюсь отправить объект javascript через websockets:

в документации faye-websockets говорится:

отправить(сообщение) принимает строку или буфер и отправляет текстовое или двоичное сообщение через подключение к другому узлу.

на стороне сервера я использую node и faye.

var WebSocket = require('faye-websocket');
var http = require('http');

var server = http.createServer();
server.addListener('upgrade', function(request, socket, head) {
    var ws = new WebSocket(request, socket, head);
    ws.send({topic:'handshake', data:'sdf487rgiuh7'});
});
server.listen(8000);

клиентской стороне:

<script>
    var ws = new WebSocket('ws://localhost:8000');
    ws.onmessage = function(e) {
        console.log(e.data); //prints [Object object] string and not the object
    };
</script>

в чем моя ошибка? Спасибо

3 ответов


WebSockets поддерживает отправку и получение: строк, типизированных массивов (ArrayBuffer) и Blobs. Перед отправкой объекты Javascript должны быть сериализованы в один из вышеперечисленных типов.

чтобы отправить объект в виде строки, вы можете использовать встроенную поддержку JSON:

ws.send(JSON.stringify(object));

чтобы отправить объект в виде типизированного массива, вы можете использовать библиотеку javascript BSON, такую как этот:

ws.send(BSON.serialize(object));

при получении сообщения WebSocket вам нужно будет десериализовать он.

для десериализации строки JSON из сообщения WebSocket:

ws.onmessage = function (e) {
    var object = JSON.parse(e.data);
    ...
};

если вы используете двоичные сообщения через WebSocket, то сначала вы должны установить атрибут binaryType для получения всех двоичных сообщений в виде типизированных массивов:

ws.binaryType = "arraybuffer";

тогда десериализация будет выглядеть так:

ws.onmessage = function (e) {
    var object = BSON.deserialize(e.data);
    ...
};

вот сообщение в блоге о использование BSON в Javascript;


Я в основном работаю с сокетом.IO, но похоже, вам нужно stringify ваши данные на сервере и проанализировать их в клиенте следующим образом:

на сервере:

ws.send(JSON.stringify({topic:'handshake', data:'sdf487rgiuh7'}));

клиент:

console.log(JSON.parse(e.data));

клиент:

const bson = new BSON();
ws.binaryType = 'arraybuffer';

ws.onmessage = function(event) {
  console.log(bson.deserialize(Buffer.from(event.data)));
}

сервер:

 const data = bson.serialize({ ... });
 ws.send(data);