【问题标题】:Need help with setting up comet code在设置彗星代码方面需要帮助
【发布时间】:2011-02-04 00:25:55
【问题描述】:

有没有人知道一种方法,或者认为可以将 Node.js 与 Nginx http 推送模块连接起来,以保持客户端和浏览器之间的持久连接。

我是彗星的新手,所以只是不了解出版等,也许有人可以帮助我。

到目前为止我设置的内容如下。我下载了 jQuery.comet 插件并设置了以下基本代码:

客户端 JavaScript

<script type="text/javascript">

    function updateFeed(data) {
        $('#time').text(data);
    }

    function catchAll(data, type) {
        console.log(data);
        console.log(type);
    }

    $.comet.connect('/broadcast/sub?channel=getIt');
    $.comet.bind(updateFeed, 'feed');
    $.comet.bind(catchAll);

    $('#kill-button').click(function() {
        $.comet.unbind(updateFeed, 'feed');
    });
</script>

从中我可以理解的是,客户端将继续收听 URL,然后是 /broadcast/sub=getIt。当有消息时,它会触发 updateFeed。

非常基本且易于理解的 IMO。

Nginx http 推送模块配置

default_type 应用程序/八位字节流; 发送文件; keepalive_timeout 65; push_authorized_channels_only 关闭;

server {
  listen       80;
  location /broadcast {
    location = /broadcast/sub {
      set $push_channel_id $arg_channel;
      push_subscriber;
      push_subscriber_concurrency broadcast;
      push_channel_group broadcast;
    }

    location = /broadcast/pub {
      set $push_channel_id $arg_channel;
      push_publisher;
      push_min_message_buffer_length 5;
      push_max_message_buffer_length 20;
      push_message_timeout 5s;
      push_channel_group broadcast;
    }
  }
}

好的,现在这告诉 nginx 在端口 80 上侦听对 /broadcast/sub 的任何调用,并将返回发送到 /broadcast/pub 的任何响应。

也很基本。这部分并不难理解,并且在互联网上有很好的记录。大多数情况下,这背后都有一个 ruby​​ 或 php 文件来进行广播。

我的想法是让 node.js 广播 /broadcast/pub。我认为这会让我在不中断连接的情况下从服务器到客户端拥有persistent streaming data。我尝试了循环请求的长轮询方法,但我认为这会更有效。

或者这是行不通的。

Node.js 文件

现在创建 Node.js 我迷路了。首先,我不知道如何让 node.js 以这种方式工作。

我用于长轮询的设置如下:

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(new Date());
    res.close();
    seTimeout('',1000);
}).listen(8000);

这会监听 8000 端口并仅写入响应变量。

对于长时间轮询,我的 nginx.config 看起来像这样:

server {
  listen      80;
  server_name _;

  location / {
    proxy_pass   http://mydomain.com:8080$request_uri;
    include      /etc/nginx/proxy.conf;
  }
 }

这只是将端口 80 重定向到 8000 并且工作正常。

有没有人知道如何让 Node.js 以 Comet 理解的方式运行。会非常好,你会帮我很多。

资源

二手

要使用faye,我必须安装comet 客户端,但我想使用Nginx 提供的客户端。这就是为什么我不只使用faye。 nginx 使用的那个优化了很多。

额外

【问题讨论】:

    标签: jquery nginx comet node.js persistent-connection


    【解决方案1】:

    看着your link,在我看来,所有发布/订阅工作都是由 Nginx 完成的,Ruby 代码仅用于测试和发送消息。客户端仍在使用长轮询:

    在上面的脚本中,发布者每五秒向我们的 Nginx 服务器发出一个新事件,然后将数据推送给两个订阅者已打开长轮询连接并正在等待数据。一旦消息发送给每个订阅者,Nginx 会关闭它们的连接,然后客户端会立即重新建立它们以等待下一条可用消息。

    Nginx 充当简单的消息重译器(非常聪明的设置顺便说一句,感谢链接)。

    简而言之:浏览器不支持您尝试进行的这种连接。这就是 WebSockets 的发明目的。

    稍后我将在 Node.js 中编写一些代码,以便在 Nginx 中使用此设置(我也对此感兴趣)。

    【讨论】:

    • 您好,感谢您再次发表评论。我想我们都喜欢这项技术。我已经发现它仍然是长轮询,但我认为这比传统的长轮询更优雅一点。我已经设法使用它建立了一个小例子。我仍在忙于在它之上构建。完成后我会发布它,我也有兴趣看到你的实现。
    • 顺便说一下,Nginx 也有一个模块来从 PHP 会话中提取数据。这将彻底解决我在使用 Node.js 和会话时遇到的“问题”。你为我解决了一些问题,但我认为在 Nginx 中这样做会更好,我可以将它传递给 Node.js。我期待您关于 nginx 的 http 推送的解决方案。我坚持以正确的方式发布。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2010-11-05
    • 2011-01-31
    相关资源
    最近更新 更多