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

Bra*_*ith 7 javascript node.js express socket.io

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

debug - websocket writing 3:::{"result":1368673052397}
debug - websocket writing 3:::{"result":1368673053399}
...
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是服务器以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();
});
Run Code Online (Sandbox Code Playgroud)

jos*_*736 5

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

WebSocket协议本身最近才增加了对通过套接字发送的数据压缩的支持.Soket.io 尚不支持压缩,其他节点WebSocket服务器也不支持.

老实说,对于您在示例中发送的少量数据,压缩实际上会适得其反,因为它可能会增加通过线路发送的数据量.


Bra*_*ith 2

阅读了一些评论后,我决定查看第 3 方库来处理客户端的解压缩,这使我选择了 JSXCompressor。

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

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

在服务器端,我使用 zlib 来处理 gzip 压缩。

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();
});
Run Code Online (Sandbox Code Playgroud)