Отправить socket.io данные ответа клиенту от узла.JS сервер в формате gzip



Проблема заключается в том, что я не знаю, как определить, сжаты ли данные, которые я отправляю обратно клиенту, в формате gzip. Глядя на вывод моего сервера из командной строки, Я вижу:



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


Мне кажется, что сервер пишет ответ в виде ascii, а не сжимает его перед отправкой.



Ниже приведен пример, который я написал, чтобы получить эти результаты. Из того, что я прочитал, пока я устанавливаю ' browser client gzip ' мои ответы должны быть отправлены gzip. Если это не так, как я это делаю, и если да, то как я могу определить по отладочной информации сервера, что они на самом деле являются сжатыми ответами.

При запуске сервера я использую следующую команду в BASH:



$ NODE_ENV=приложение производственного узла.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();
});
615   4  

4 ответов:

Опция browser client gzip включает сжатие gzip для socket.io сценарий, который подается из /socket.io/socket.io.js. Это не влияет на фактическое подключение WebSocket.

Сам протокол WebSocket только недавно добавил поддержку сжатия данных, передаваемых через сокет. Soket.io пока не поддерживает сжатие , как и другие серверы WebSocket узлов .

Честно говоря, с небольшим количеством данных, которые вы отправляете в своем примере, сжатие будет действительно контрпродуктивно, поскольку это, вероятно, увеличит количество данных, передаваемых по проводу.

Поддерживается в socket.io 1.4 Сжатие включено по умолчанию.

Прочитав некоторые комментарии, я решил обратиться к сторонним библиотекам, чтобы справиться с декомпрессией на стороне клиента, что привело меня к JSXCompressor.

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

JSXCompressor возьмет кодированные base64 gzipped данные с сервера и обработает распаковку и декодирование. Просто загрузите библиотеку и поместите ее в соответствующую папку.

На стороне сервера я использую zlib для обработки сжатие.

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

Сжатие теперь включено по умолчанию (>1.4), см. Также этот пост для справки: http://socket.io/blog/socket-io-1-4-0/

Comments

    Ничего не найдено.