Отправить 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();
});
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