我遇到的问题是我不知道如何能够判断我发送回客户端的数据是否以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();
- });
解决方法
浏览器客户端gzip选项为从/socket.io/socket.io.js提供的socket.io脚本启用gzip压缩.它不会影响实际的WebSocket连接.
WebSocket协议本身最近才增加了对通过套接字发送的数据压缩的支持. Soket.io does not yet support compression,也不是other node WebSocket servers.
说实话,对于您在示例中发送的少量数据,压缩实际上会适得其反,因为它可能会增加通过线路发送的数据量.