tutorial socket rooms nodejs example node.js serialization websocket javascript-objects faye

node.js - rooms - socket.io example



enviar un objeto javascript a través de websockets con faye (3)

Hola, estoy intentando enviar un objeto javascript a través de websockets:

la documentación de faye-websockets dice:

send (message) acepta una String o un Buffer y envía un mensaje de texto o binario a través de la conexión al otro par.

lado del servidor estoy usando node y 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);

lado del cliente:

<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>

¿Cuál es mi error? Gracias


Básicamente, estoy trabajando con Socket.IO, pero parece que necesitas codificar tus datos en el servidor y analizarlos en el cliente de la siguiente manera:

en el servidor:

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

en el cliente:

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


Cliente:

const bson = new BSON(); ws.binaryType = ''arraybuffer''; ws.onmessage = function(event) { console.log(bson.deserialize(Buffer.from(event.data))); }

Servidor:

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


WebSockets admite el envío y la recepción de cadenas, matrices tipadas (ArrayBuffer) y Blobs. Los objetos Javascript deben ser serializados a uno de los tipos anteriores antes de enviarlos.

Para enviar un objeto como una cadena, puede usar el soporte integrado JSON:

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

Para enviar un objeto como una matriz tipada, puede usar una biblioteca de JavaScript BSON como esta :

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

Cuando reciba un mensaje de WebSocket, deberá deserializarlo.

Para deserializar una cadena JSON de un mensaje WebSocket:

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

Si está utilizando mensajes binarios sobre WebSocket, primero debe establecer el atributo binaryType para recibir todos los mensajes binarios como matrices tipadas:

ws.binaryType = "arraybuffer";

Entonces la deserialización se verá así:

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

Aquí hay una publicación de blog sobre el uso de BSON en Javascript ;