把插座.IO响应数据以gzip格式从node.js服务器到客户端
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
选项为套接字启用gzip压缩。io 脚本从/socket.io/socket.io.js
服务。它不影响实际的WebSocket连接。
WebSocket协议本身最近才增加了对通过socket发送的数据压缩的支持。插口。io还不支持压缩,其他节点的WebSocket服务器也不支持。
老实说,在您的示例中发送的数据量很少,压缩实际上会适得其反,因为它可能会增加通过网络发送的数据量。
socket支持。io 1.4
压缩现在是默认启用的(>1.4),也可以参考这篇文章:http://socket.io/blog/socket-io-1-4-0/
在阅读了一些评论后,我决定看看第三方库来处理客户端的解压缩,这导致我选择了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();
});
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 如何使用 node.js 比较两个 json 数组
- Node.js's Buffer.writeFloatBE in Javascript
- node.js:setInterval()正在跳过调用
- 如何处理node.js节点mongodb中的连接和查询队列
- Node.js正在更改应用程序以使用集群模块
- 如何使用Node.js最有效地解析网页
- 在openshift node js应用程序中获取请求
- 正在删除node.js中已验证的网站
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- 在索引.html和应用.js [node.js] 之间共享变量
- Node.js中的JavaScript原型对象效率
- node.js请求数据事件未在CORS ajax调用中触发
- 使用node.js制作网站
- 使用node.js服务器中的evernote api获取note内容
- 有没有任何方法可以使用node-js从不同的机器打开浏览器
- 使用CI和CodeDeploy对node.js应用程序进行连续部署
- 在Node.js中上传和检索图像
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 如何使用 Node JS 获取 JSON 嵌套数组值