Привет всем, я пытаюсь отправить объект javascript через websockets:
в документации faye-websockets говорится:
send (message) принимает либо String, либо Buffer и отправляет текстовое или двоичное сообщение по соединению с другим одноранговым узлом.
Я использую 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>
Какова моя ошибка? благодаря
Ответ 1
WebSockets поддерживают отправку и получение: строки, типизированные массивы (ArrayBuffer) и Blobs. Перед отправкой объекты Javascript должны быть сериализованы до одного из вышеуказанных типов.
Чтобы отправить объект в виде строки, вы можете использовать встроенную поддержку JSON:
ws.send(JSON.stringify(object));
Чтобы отправить объект в виде типизированного массива, вы можете использовать библиотеку BSON javascript, такую как эта:
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;
Ответ 2
Я в основном работаю с Socket.IO, но похоже, что вам нужно укрепить свои данные на сервере и проанализировать его на клиенте так:
на сервере:
ws.send(JSON.stringify({topic:'handshake', data:'sdf487rgiuh7'}));
в клиенте:
console.log(JSON.parse(e.data));
Ответ 3
Клиент:
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);