Invia i dati di risposta socket.io al client dal server node.js in formato gzip

Il problema che sto avendo è che non so come essere in grado di dire se i dati che sto inviando al client sono compressi in formato gzip. Sto guardando l’output del mio server dalla riga di comando:

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

A me sembra che il server stia scrivendo la risposta in forma ascii piuttosto che comprimerla prima di inviarla.

Di seguito è riportato l’esempio che ho scritto per produrre questi risultati. Da quanto ho letto fintanto che ho impostato il client del browser gzip, le mie risposte dovrebbero essere inviate gzip. Se non sono come faccio questo e se sono come posso dire dalle informazioni di debug del server che sono in realtà le risposte compresse.

Quando lancio il server, utilizzo il seguente comando in BASH:

$ NODE_ENV = nodo di produzione app.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( "\n"+ "\n"+ "\n"+ "var socket=io.connect('http://127.0.0.1:3000');\n"+ "socket.on('message', function(data) {\n"+ " $(\"h2\").text(data);\n"+ "});\n"+ "\n"+ "

"+process.env.NODE_ENV+"

\n"+ "

\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’opzione browser client gzip abilita la compressione gzip per lo script socket.io fornito da /socket.io/socket.io.js . Non influisce sulla reale connessione WebSocket.

Il protocollo WebSocket ha aggiunto solo di recente il supporto per la compressione dei dati inviati tramite socket. Soket.io non supporta ancora la compressione , né altri server WebSocket .

Per essere onesti, con la piccola quantità di dati che stai inviando nel tuo esempio, la compressione sarà in realtà controproducente in quanto è probabile che aumenti la quantità di dati inviati via cavo.

Supportato in socket.io 1.4 La compressione è abilitata per impostazione predefinita.

Dopo aver letto alcuni commenti ho deciso di guardare le librerie di terze parti per gestire la decompressione sul lato client che mi ha portato a JSXCompressor.

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

JSXCompressor prenderà i dati gzipped codificati in base 64 dal server e gestirà la decompressione e la decodifica. Basta scaricare la libreria e inserirla nella cartella appropriata.

Sul lato server sto usando zlib per gestire il 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( "\n"+ "\n"+ "\n"+ "\n"+ "

\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 compressione è ora abilitata di default (> 1.4), vedi anche questo post per riferimento: http://socket.io/blog/socket-io-1-4-0/