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

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

debug - websocket writing 3:::{"result":1368673052397} debug - websocket writing 3:::{"result":1368673053399} ... 

对我来说,这看起来像服务器以asciiforms写入响应,而不是在发送前先压缩。

以下是我为编写这些结果而编写的示例。 从我读过的内容来看,只要我设置了“浏览器客户端gzip”,我的回应应该是发送gzip。 如果他们不是这样做,如果我怎么能从服务器的debugging信息告诉他们实际上是压缩响应。

当我启动服务器时,我在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服务器也不支持 。

说实话,在你的例子中发送less量的数据,压缩实际上会起反作用,因为它可能会增加通过线路发送的数据量。

在socket.io中支持1.4默认情况下启用压缩。

在阅读了一些评论之后,我决定查看第三方库来处理客户端的解压缩,这导致了我的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(); }); 

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