【问题标题】:node.js - push data to client - only one client can be connected?node.js - 将数据推送到客户端 - 只能连接一个客户端?
【发布时间】:2011-05-20 15:29:15
【问题描述】:

我正在尝试创建一个服务器端解决方案,该解决方案通过 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 的选项卡时,它只会永远加载。只有当我关闭第一个选项卡时,我才能从服务器获得内容。

我需要做什么才能为多个客户端提供服务?

【问题讨论】:

  • 这很奇怪。根据此页面,它应该可以工作:blog.nemikor.com/2010/05/21/long-polling-in-nodejs
  • @thejh 嗯,即使我尝试使用 res.end() 返回一个简单的响应(没有彗星,只是简单的请求响应),在我看来,客户必须等待前一个为了从服务器获取内容。也许这是一些操作系统问题?我在 ubuntu vm-ware 上运行 node.js 0.3.2。
  • @Max:你确定版本吗?甚至 github 都说 0.3.1 是最新的...github.com/ry/node
  • @thejh 是的,0.3.2-pre,这就是 node -v 的输出
  • @Max:netstat --tcp 说什么?两个连接?两者都建立还是一个 syn_wait 左右?

标签: node.js comet


【解决方案1】:

这绝对是一个错误,由于keep-alive 和 HTTP/1.1 和 Node 搞砸了,浏览器会重复使用相同的连接。

你可以在Opera11中看到这个,打开页面两次,是完全相同的页面,使用完全相同的连接。

Curl 和所有未设置 Connection: keep-alive 的东西都可以正常工作,但浏览器无法两次打开同一页面。虽然你可以打开 'localhost:8010' 和 'localhost:8010/foo' 并且它可以在两个页面上工作。

注意:这只会影响GET 请求,POST 请求工作正常,因为没有重复使用连接。

我已经为此提交了issue

【讨论】:

  • 嗯,有什么解决方法吗?感谢您提交关于此的错误报告! :-)
  • 有,你需要做一个POST 请求而不是一个GET 请求(浏览器不会重新使用那个连接)所以iirc,你必须一个@987654328 @ 这里你可以设置请求类型,但是使用纯 HTTP 只是失败 atm。
【解决方案2】:

您应该使用socket.io。它为您处理所有繁重的工作,是一个非常酷的库。

【讨论】:

    【解决方案3】:

    小心这个!

    node.js 非阻塞的,但同时一次只处理 1 个连接。您所做的是将节点置于死状态,这就是为什么您在关闭第一个客户端时会在第二个客户端上看到数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多