envoi d'un objet javascript via websockets avec faye

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

La documentation faye-websockets dit:

Envoyer (message) accepte une chaîne ou un tampon et envoie un message texte ou binaire sur 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

26
demandé sur RzR 2012-10-23 14:39:21

3 réponses

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 dans 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 en tant que 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 un JSON chaîne 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";

Alors la désérialisation ressemblera à ceci:

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

Voici un article de blog sur utilisant BSON en Javascript ;

67
répondu kanaka 2012-10-23 15:39:31

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

Dans le serveur:

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

Dans le client:

console.log(JSON.parse(e.data));
1
répondu udidu 2012-10-23 11:00:49

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);
1
répondu Alex Ivasyuv 2018-01-09 12:29:56