gpt4 book ai didi

jquery - nginx comet 使用 jquery 进行长轮询

转载 作者:行者123 更新时间:2023-12-01 04:13:52 27 4
gpt4 key购买 nike

最近我一直在尝试使用此插件在 Ngnix 服务器上为我的应用程序设置 cometd 服务器: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 有一个更适合我的替代插件,请告诉我。

最佳答案

好吧,经过一些研究,我设法发现我的 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');

这就是我的解决方案,我希望您觉得这有帮助,如果有不清楚的地方,我深表歉意,第一次回答这样的问题。

关于jquery - nginx comet 使用 jquery 进行长轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com