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