2

最近我一直在尝试使用这个插件在 Ngnix 服务器上为我的应用程序设置一个彗星服务器:https ://github.com/wandenberg/nginx-push-stream-module

由于 GNU/GPL 的限制性,我无法使用插件提供的 JS,所以我尝试使用 jquery ajax 请求自己实现它。

我的 Nginx 配置如下所示:

  location /channels-stats {
        # activate channels statistics mode for this location
        push_stream_channels_statistics;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

        # query string based channel id
        set $push_stream_channel_id             $arg_id;
    }

    location ~ /pub/(.*) {
        # activate publisher (admin) mode for this location
        push_stream_publisher admin;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

        # query string based channel id
        set $push_stream_channel_id             $1;
    }

    location ~ /sub/(.*) {
        # activate subscriber (streaming) mode for this location
        push_stream_subscriber;   

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';


       # positional channel path
        set $push_stream_channels_path              $1;
    }

我尝试使用(在萤火虫中)测试双向通信的代码片段是:

//reciever
$.ajax({
    url:'sub/test?callback=mycallback',
    dataType:'json',
    success:function(data){
          console.log(data);
    }
});

//sender
$.ajax({
    url:'pub/test',
    dataType:'json',
    type:'POST',
    data:'mycallback({"J":5,"0":"N"})'

});

我试图让它跨域工作,但是即使在同一个域上我也无法让它工作,实际发生的是:

当我使用接收代码时,它会启动与服务器的连接并按预期进行无休止的加载,然后我尝试使用发送者代码响应长轮询。

现在在 NET 选项卡(萤火虫)上的控制台中,我可以看到,一旦我发送 POST,它就会在响应中以纯文本形式接收它,但仍然保持连接而不给出回调!因此,如果我反复发送帖子,我可以在 net response 选项卡中的 firebug 中看到他们正在收集,但接收者函数没有给出回调!因此我无法准确提取数据!

现在我在另一个域和同一个源域中都尝试了这个,所以我认为这里的策略不是问题,问题是 jquery 片段永远不会到达回调,尽管它确实在请求后到达回调仅限超时!请帮忙。

附带说明一下,如果您认为 NGINX 有一个更适合我的替代插件,请告诉我。

4

1 回答 1

2

好的,经过一些研究,我设法弄清楚我的 nginx 配置中有一个错误,导致连接无休止,我将其更改为:

 location /channels-stats {
        # activate channels statistics mode for this location
        push_stream_channels_statistics;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

        # query string based channel id
        set $push_stream_channel_id             $arg_id;
    }

    location ~ /pub/(.*) {
        # activate publisher (admin) mode for this location
        push_stream_publisher admin;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

        # query string based channel id
        set $push_stream_channel_id             $1;
    }

    location ~ /sub/(.*) {
        # activate subscriber (streaming) mode for this location
        push_stream_subscriber long-polling; //<----------------------EDITED LINE

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';


       # positional channel path
        set $push_stream_channels_path              $1;
    }

我为双向通信封装了两个小功能

var datalink={
        listen:function(success,error,complete,url){
        //reciever
            $.ajax({
                url:url,
                dataType:'jsonp',
                success:success,
                error:error,
                complete:complete
            });
        },
        send:function(data,success,error,complete,url){
        //sender
            $.ajax({
                url:url,
                dataType:'json',
                success:success,
                error:error,
                complete:complete
                type:'POST',
                data:JSON.stringify(data)
            }); 
        }   

    };

注意:发送数据的函数使用方法 JSON.stringify(your-object) 虽然大多数浏览器都支持它,建议使用这样的东西:http: //bestiejs.github.io/json3/ 为了添加对 json.stringfying 的旧浏览器的支持。

用法示例:

从服务器监听(订阅):

datalink.listen(function(data){

                    console.log(data);//<---your recieved object
                                },undefined,undefined,'http://example.com/sub/foo');

发送到服务器(发布):

datalink.send({x:5}//<--the object you are about to send
               ,undefined,undefined,undefined,'http://chessbless.com/pub/test');

这就是我的解决方案,我希望你觉得这很有帮助,如果有不清楚的地方,我很抱歉,这是第一次回答 SO。

于 2013-05-31T18:41:43.393 回答