web-dev-qa-db-fra.com

envoi d'un objet javascript via des websockets avec faye

Salut à tous, j'essaie d'envoyer un objet javascript via les websockets:

la documentation de faye-websockets indique:

send (message) accepte une chaîne ou un tampon et envoie un message texte ou binaire via la connexion à l'autre homologue.

côté serveur j'utilise node et 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);

côté client:

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

quelle est mon erreur? Merci

34
frx08

Les WebSockets prennent en charge l'envoi et la réception: chaînes, tableaux typés (ArrayBuffer) et Blobs. Les objets Javascript doivent être sérialisés vers l'un des types ci-dessus avant d'être envoyés.

Pour envoyer un objet sous forme de chaîne, vous pouvez utiliser le support JSON intégré:

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

Pour envoyer un objet sous forme de tableau typé, vous pouvez utiliser une bibliothèque BSON javascript telle que celle-ci :

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

Lorsque vous recevez un message WebSocket, vous devez le désérialiser.

Pour désérialiser une chaîne JSON d'un message WebSocket:

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

Si vous utilisez des messages binaires sur WebSocket, vous devez d'abord définir l'attribut binaryType afin de recevoir tous les messages binaires sous forme de tableaux typés:

ws.binaryType = "arraybuffer";

Ensuite, la désérialisation ressemblera à ceci:

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

Voici un article de blog sur en utilisant BSON en Javascript ;

77
kanaka

Client:

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

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

Serveur:

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

Je travaille essentiellement avec Socket.IO, mais il semble que vous ayez besoin de filtrer vos données sur le serveur et de les analyser dans le client comme suit:

sur le serveur:

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

chez le client:

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