簡體   English   中英

以gzip格式從node.js服務器向客戶端發送socket.io響應數據

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

我遇到的問題是我不知道如何能夠判斷我發送回客戶端的數據是否以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選項為從/socket.io/socket.io.js提供的socket.io 腳本啟用gzip壓縮。 它不會影響實際的WebSocket連接。

WebSocket協議本身最近才增加了對通過套接字發送的數據壓縮的支持。 Soket.io 尚不支持壓縮其他節點WebSocket服務器也不支持

老實說,對於您在示例中發送的少量數據,壓縮實際上會適得其反,因為它可能會增加通過線路發送的數據量。

socket.io 1.4支持默認情況下啟用壓縮。

在閱讀了一些評論后,我決定查看第三方庫來處理客戶端的解壓縮,這導致我轉向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();
});

現在默認啟用壓縮(> 1.4),另請參閱此帖子以供參考: http//socket.io/blog/socket-io-1-4-0/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM