把插座.IO响应数据以gzip格式从node.js服务器到客户端

Send socket.io response data to client from node.js server in gzip format

本文关键字:node js 服务器 客户端 格式 gzip IO 插座 响应 数据      更新时间:2023-09-26

我遇到的问题是,我不知道如何能够判断我发送回客户端的数据是否以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();
});

browser client gzip选项为套接字启用gzip压缩。io 脚本/socket.io/socket.io.js服务。它不影响实际的WebSocket连接。

WebSocket协议本身最近才增加了对通过socket发送的数据压缩的支持。插口。io还不支持压缩,其他节点的WebSocket服务器也不支持。

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

socket支持。io 1.4

压缩现在是默认启用的(>1.4),也可以参考这篇文章:http://socket.io/blog/socket-io-1-4-0/

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

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

JSXCompressor将从服务器获取base64编码的压缩数据,并处理解压缩和解码。只需下载库并将其放入相应的文件夹。

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