服务器如何在长轮询中没有客户端请求的情况下返回数据?

时间:2016-08-20 06:53:51

标签: jquery ajax real-time comet long-polling

我实现了一种非常简单和懒惰的方法,通过ajax在服务器中通过间隔请求数据实时影响。

但是我想选择长轮询/彗星技术,因为他们鼓励服务器在有一个而不是客户端不断拉动时推送数据,即使没有。

我完全理解长轮询和彗星工作的方式。但我希望看到服务器在有数据发送到客户端时推送的编码部分。

很久以前客户端发出的请求(长轮询)如何才能在有数据时推送服务器?我不明白这一部分。有人可以在编码中显示吗?

目前我通过ajax检查间隔中的新数据。现在,如何在没有客户端要求的数据的情况下自动返回服务器时,如何修改它以实现长轮询?

(function notify(){
    $.each(id, function(k, v){
      jQuery.ajax({

           method: "POST",
           url: "/notification.php",
           "data": v,
           error: function() {
             reject('error');
           },  
           success: function(result) {
             console.log(result.data);         
           }
       });
    })
setTimeout(function(){
    notify();
 }, 1000);
})()

由于此问题标记为重复:

我说我完全理解长轮询和彗星的概念。我在这里不是要理解这个概念,而是为了实际实现这个概念的代码!

1 个答案:

答案 0 :(得分:0)

最后我在这里找到了答案:

http://www.zeitoun.net/articles/comet_and_php/start

我选择了网站中给出的第二个例子:经典ajax彗星 它就像魅力一样。下面是jquery中index.html(客户端页面)的代码也来自网站..

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Comet demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--     <script type="text/javascript" src="prototype.js"></script> -->
    <script type="text/javascript" src="jquery.js"></script>
  </head>
 <body>
<div id="content"></div>
<div style="margin: 5px 0;">
<form id="cometForm" action="javascript:void(0);" method="get">
<input id="word" type="text" name="word" value=""/>
<input type="submit" name="submit" value="Send"/>
</form>
</div>


<script type="text/javascript">
(function($){
function handleResponse(response){
$('#content').append('<div>' + response['msg'] + '</div>');
}

var timestamp = 0;
var url = './chat_backend.php';
var noerror = true;
var ajax;

function connect() {
ajax = $.ajax(url, {
type: 'get',
data: { 'timestamp' : timestamp },
success: function(transport) {
eval('var response = '+transport);
timestamp = response['timestamp'];
handleResponse(response);
noerror = true;
},
complete: function(transport) {
(!noerror) && setTimeout(function(){ connect() }, 5000) || connect();
noerror = false;
}
});
}

function doRequest(request) {
$.ajax(url, {
type: 'get',
data: { 'msg' : request }
});
}

$('#cometForm').on('submit', function(){
doRequest($('#word').val());
$('#word').val('');
return false;
});

$(document).ready(function(){
connect();
});
})(jQuery);
</script>

</body>
</html>