2013-05-15 133 views
7

我遇到的问题是我不知道如何能够判断我要发回的数据客户端以gzip格式压缩。看着我的服务器的命令行我看到的输出:以gzip格式从node.js服务器向客户端发送socket.io响应数据

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(); 
}); 
+0

你可以简单地放气JSON和使用像zip.js或jszip一个lib膨胀的客户端 - 字符串结束。 – dandavis

+0

@dandavis我下载了jszip,并且我已经在服务器端使用zlib获得了deflate部分,我可以将压缩数据发送到客户端base64编码,但是我似乎无法弄清楚如何对base64编码响应进行膨胀客户端。如果我使用jszip库,你能否向我发送index.html中需要的更新代码来处理这个问题? –

+0

如果你在服务器上发送类似于base64的东西(deflate(JSON.stringify(str))),然后在客户端上使用JSON.parse(inflate(atob(data)))... – dandavis

回答

2

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

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

JSXCompressor会从服务器gzip压缩编码数据的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(); 
}); 
5

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

WebSocket协议本身只是最近增加了对通过套接字发送的数据的压缩的支持。 Soket.io does not yet support compression,也不是other node WebSocket servers

说实话,在你的例子中发送的数据量很小,压缩实际上会适得其反,因为它可能会增加通过线路发送的数据量。

+1

在这个例子中,不必要。但这只是一个例子。在我的实际应用程序中,我发送一个更长的json字符串,并且由于带宽限制,需要压缩。 –

+0

@BradSmith:不幸的是,你现在是SOL,因为socket.io不支持WebSocket压缩。作为一种解决方法,您可以通过套接字发送“可用数据”消息,然后执行传统的XHR请求以获取实际的JSON数据,这些数据可以进行压缩。 – josh3736

+0

或者使用兼容客户端/服务器的压缩库来自己压缩数据。 – robertklep

相关问题