需要有关设置彗星代码的帮助

时间:2010-04-03 14:36:08

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

有没有人知道某种方式或者认为可以将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>

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

相当基本且易于理解的IMO。

  

Nginx http推送模块配置

default_type application / octet-stream; sendfile on; keepalive_timeout 65; push_authorized_channels_only off;

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的任何响应。

非常基本。这部分并不难理解,并且在互联网上有很好的记录。大多数情况下,背后都有一个红宝石或一个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理解的方式行事。会非常好,你会帮助我很多。

的recources

使用的

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

额外

1 个答案:

答案 0 :(得分:2)

your link看来,我觉得所有的pub / sub工作都是由Nginx完成的,Ruby代码只用于测试和发送消息。客户仍在使用长轮询:

  

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

Nginx作为消息的简单重传器(非常聪明的设置BTW,感谢链接)。

简而言之:浏览器不能用于您尝试的此类连接。这就是WebSockets的发明。

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