我正在尝试创建一个服务器端解决方案,它通过node.js定期将数据推送到客户端(无客户端轮询)。连接应该永久打开,每当服务器有新数据时,它就会将其推送到客户端。
这是我的简单示例脚本:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
sys.puts('Start sending...');
setInterval(function(){
res.write("<script type='text/javascript'>document.write('test<br>')</script>");
}, 10000);
}).listen(8010);
这基本上有效,但似乎一次只能连接一个客户端。
如果我用浏览器打开http://127.0.0.1:8010/
,我会看到每10秒写一次新输出。但是当我用相同的URL打开另一个选项卡时,它只会永远加载。只有当我关闭第一个标签时,才会从服务器获取该标签。
为了服务多个客户端,我需要做什么?
答案 0 :(得分:3)
您应该使用socket.io。它为您处理所有繁重的工作,是一个非常酷的库。
答案 1 :(得分:3)
这绝对是一个错误,会发生的事情是,由于keep-alive
和HTTP / 1.1以及Node搞砸了,浏览器会重新使用相同的连接。
你可以在Opera11中看到这个,打开页面两次,它是完全相同的页面,使用完全相同的连接。
卷曲和未设置Connection: keep-alive
的所有内容都可以正常工作,但浏览器无法两次打开同一页面。虽然你可以打开'localhost:8010'和'localhost:8010 / foo',但它可以在两个页面上运行。
注意:这只会影响GET
次请求,POST
请求工作正常,因为没有重新使用连接。
我已就此提交了issue。
答案 2 :(得分:1)
小心这个!
node.js
非阻止,但同时一次只能处理1个连接。你所做的是将节点置于死状态,这就是你在关闭第一个客户端时看到第二个客户端数据的原因。