最近,我一直在尝试使用此插件在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;
}
和我试图使用的代码片段(在firebug中)来测试两种方式的通信:
//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选项卡(firebug)的控制台中我可以看到,一旦我发送POST,它就会在响应中以纯文本形式接收它,但仍然保持连接而不进行回调!所以,如果我反复发送帖子,我可以在他们刚刚收集的网络响应标签中的firebug中看到,但是没有从接收器功能给出回调!因此我无法获得数据!
现在我在另一个域和同一个域中尝试了这个,所以我认为这里的策略不是问题,问题是jquery片段没有得到回调,尽管它确实达到了回调一旦请求超时! 请帮忙。
旁注,如果您认为NGINX有另一个插件适合我,请告诉我。
答案 0 :(得分: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。