Envoyer les données de réponse socket.io au client à partir du serveur node.js au format gzip

Le problème que j'ai, c'est que je ne sais pas savoir si les données que je renvoie au client sont ou non compressées au format gzip. En regardant la sortie de mon serveur à partir de la ligne de commande, je vois:

debug - websocket writing 3:::{"result":1368673052397} debug - websocket writing 3:::{"result":1368673053399} ... 

Pour moi, cela semble que le serveur écrit la réponse sous forme ascii plutôt que de la compresser avant d'envoyer.

Voici l'exemple que j'ai écrit pour produire ces résultats. D'après ce que j'ai lu tant que j'ai configuré 'client gzip client', mes réponses devraient être envoyées par gzip. S'ils ne sont pas comment puis-je faire cela et si je suis, comment puis-je savoir à partir des informations de débogage du serveur qu'ils sont en fait des réponses compressées.

Lorsque je lance le serveur, j'utilise la commande suivante dans BASH:

$ NODE_ENV = nœud de production application.js

 var express = require('express'), http = require('http'); var app = express(), server = http.createServer(app), io = require('socket.io').listen(server); io.configure('production', function() { io.enable('browser client minification'); io.enable('browser client etag'); io.enable('browser client gzip'); io.set('log level', 3); }); app.use(express.logger('dev')); app.get('/', function(req, res) { res.send( "<script src='/socket.io/socket.io.js'></script>\n"+ "<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>\n"+ "<script>\n"+ "var socket=io.connect('http://127.0.0.1:3000');\n"+ "socket.on('message', function(data) {\n"+ " $(\"h2\").text(data);\n"+ "});\n"+ "</script>\n"+ "<h1>"+process.env.NODE_ENV+"</h1>\n"+ "<h2></h2>\n" ); }); server.listen('3000'); io.sockets.on('connection', function(webSocket) { function whileLoop() { setTimeout(function() { var epoch = (new Date).getTime(); var jsonData = "{\"result\":"+epoch+"}"; webSocket.send(jsonData); whileLoop(); }, 1000); } whileLoop(); }); 

L'option browser client gzip permet la compression gzip pour le script socket.io qui est /socket.io/socket.io.js par /socket.io/socket.io.js . Cela n'affecte pas la connexion WebSocket réelle.

Le protocole WebSocket lui-même a récemment ajouté une assistance pour la compression des données envoyées sur le socket. Soket.io ne supporte pas encore la compression , ni d' autres serveurs WebSocket de nœud .

Pour être honnête, avec la petite quantité de données que vous envoyez dans votre exemple, la compression sera effectivement contre-productive car il est susceptible d' augmenter la quantité de données envoyées sur le fil.

Pris en charge dans socket.io 1.4 La compression est activée par défaut.

Après avoir lu certains des commentaires, j'ai décidé de regarder les bibliothèques tierces pour gérer la décompression du côté client qui m'a conduit à JSXCompressor.

http://jsxgraph.uni-bayreuth.de/wp/jsxcompressor/

JSXCompressor prendra les données basées sur base64 codées du serveur et gérera la décompression et le décodage. Téléchargez simplement la bibliothèque et placez-la dans le dossier approprié.

Sur le côté du serveur, j'utilise zlib pour gérer le gzipping.

 var express = require('express'), http = require('http') zlib = require('zlib'); var app = express(), server = http.createServer(app), io = require('socket.io').listen(server); app.use(express.logger('dev')); app.use(express.static(__dirname + '/public')); app.get('/', function(req, res) { res.send( "<script src='/socket.io/socket.io.js'></script>\n"+ "<script src='/java/jsxcompressor.min.js'></script>\n"+ "<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>\n"+ "<script>\n"+ "var socket=io.connect('http://127.0.0.1:3000');\n"+ "socket.on('message', function(data) {\n"+ " var jsonData = JXG.decompress(data);"+ " $(\"h1\").text(jsonData);\n"+ "});\n"+ "</script>\n"+ "<h1></h1>\n" ); }); server.listen('3000'); io.sockets.on('connection', function(webSocket) { function whileLoop() { setTimeout(function() { var epoch = (new Date).getTime(); var jsonData = "{\"result\":"+epoch+"}"; zlib.gzip(jsonData, function(err, buffer) { webSocket.send(buffer.toString('base64')); }); whileLoop(); }, 1000); } whileLoop(); }); 

La compression est maintenant activée par défaut (> 1.4), voir aussi cette publication à titre de référence: http://socket.io/blog/socket-io-1-4-0/