首页 文章

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

提问于
浏览
0

我实现了非常简单和懒惰的方法,通过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

    最后我找到了答案:

    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>
    

相关问题