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