以gzip格式从node.js服务器向客户端发送socket.io响应数据

时间:2013-05-15 15:23:24

标签: javascript node.js express socket.io

我遇到的问题是我不知道如何能够判断我发送回客户端的数据是否以gzip格式压缩。从我看到的命令行查看服务器的输出:

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

对我而言,这看起来服务器正在以ascii格式编写响应,而不是在发送之前先将其压缩。

以下是我为编写这些结果而编写的示例。根据我的阅读,只要我设置'浏览器客户端gzip',我的响应应该被发送gzip。如果他们不是我怎么做的,如果我是如何从服务器的调试信息中知道它们实际上是压缩响应。

当我启动服务器时,我在BASH中使用以下命令:

$ NODE_ENV =生产节点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(
    "<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 个答案:

答案 0 :(得分:5)

browser client gzip选项为从/socket.io/socket.io.js提供的socket.io 脚本启用gzip压缩。它不会影响实际的WebSocket连接。

WebSocket协议本身最近才添加了对通过套接字发送的数据进行压缩的支持。 Soket.io does not yet support compressionother node WebSocket servers也没有。

老实说,对于您在示例中发送的少量数据,压缩实际上会适得其反,因为它可能增加通过网络发送的数据量。< / p>

答案 1 :(得分:3)

socket.io 1.4支持 默认情况下启用压缩。

答案 2 :(得分:2)

在阅读了一些评论后,我决定查看第三方库来处理客户端的解压缩,这导致我转向JSXCompressor。

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

JSXCompressor将从服务器获取base64编码的gzip压缩数据并处理解压缩和解码。只需下载库并将其放在适当的文件夹中即可。

在服务器端,我使用zlib来处理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();
});

答案 3 :(得分:2)

默认情况下已启用压缩(&gt; 1.4),另请参阅此帖子以供参考:http://socket.io/blog/socket-io-1-4-0/