7

私が抱えている問題は、クライアントに送り返すデータが 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

4 に答える 4

5

このオプションは、から提供さbrowser client gzipれる socket.ioスクリプト/socket.io/socket.io.jsの gzip 圧縮を有効にします。実際の WebSocket 接続には影響しません。

WebSocket プロトコル自体は、ソケットを介して送信されるデータの圧縮のサポートを最近追加したばかりです。Soket.ioはまだ圧縮をサポートしておらず、他のノードの WebSocket サーバーもサポートしていません。

正直なところ、例で送信している少量のデータでは、ネットワーク経由で送信されるデータの量が増える可能性があるため、圧縮は実際には非生産的です。

于 2013-05-15T15:42:34.473 に答える
3

socket.io 1.4でサポート 圧縮はデフォルトで有効になっています。

于 2016-03-23T15:21:11.943 に答える
2

いくつかのコメントを読んだ後、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();
});
于 2013-05-16T18:56:16.113 に答える
2

圧縮はデフォルトで有効になりました (>1.4)。参照用にこの投稿も参照してください: http://socket.io/blog/socket-io-1-4-0/

于 2016-05-31T20:51:10.060 に答える