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 ;