отправка объекта 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);