代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

在客户端实现Comet

  •  2
  • Carson Myers  · 技术社区  · 14 年前

    我正在尝试在我的应用程序中实现Comet,由于我没有JavaScript的经验,我不知道如何在客户端实现。

    当服务器收到一个请求时,它只是保持打开状态,并在必要时向其写入数据:

    def render_GET(self, request):
        print "connected"
        request.write("Initiated\r\n")
        reactor.callLater(random.randint(2, 10), self._delay, request)
        return NOT_DONE_YET;
    
    def _delay(self, request):
        print "output"
        self.count += 1
        request.write("Hello... {0}\r\n".format(self.count))
        reactor.callLater(random.randint(2, 10), self._delay, request)
    

    到目前为止,我一直在客户机端使用jquery,但我不知道如何使它与服务器一起工作。 I've been looking at the jQuery.AJAX documentation 没有人回电话说“嘿!我刚收到一些数据!”他们只说“请求完成了”。

    我想 dataFilter() 函数是我想要的,因为它允许您在请求完成之前处理原始数据,但它只允许您这样做。 只是 在请求完成之前,而不是在您接收数据时。

    那么,如何通过开放请求连续接收数据呢?正如您在Python示例中看到的,每一段数据都用分隔符分隔 \r\n 所以我希望JavaScript的行为像一个线路接收器。jquery是否可以这样做,或者我是否必须直接使用xmlhttprequest/activexobject?是否有一个(简单、轻量级)库可以为我实现线路接收器?

    我希望听到一个现存的图书馆 我自己如何实现这一点,因为到目前为止我对Comet库不太满意,现在我希望只编写我需要的代码,而不必为整个库操心。

    3 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    8 年前

    在研究了其他一些Comet/jQuery问题之后,我偶然发现了: http://code.google.com/p/jquerycomet/ ,它看起来是一个jquery插件,可以满足您的需求。如果你想知道它是如何工作的,我会深入了解它的来源。

    我发现一些重要信息的问题是 here .

        2
  •  2
  •   tvanfosson    14 年前

    一种标准的技术是通过Ajax执行一个长的轮询请求(具有非常长的超时的标准调用),然后在收到响应时,让回调在被调用时启动另一个长的轮询。如果超时时间到期,则使用错误处理机制重新发出请求。它不需要有一个周期性的长请求(比如“无限iframe”技术),而是使用一系列长请求来获取服务器提供的数据。

     function longPoll( url, data, cb )
     {
           $.ajax({
              url: url,
              data: data,
              timeout: Number.MAX_VALUE,
              ...other options...
              success: function(result) {
                   // maybe update the data?
                   longPoll( url, data, cb );
                   cb.call(this,result);
              },
              error: function() {
                   longPoll( url, data, cb );
              }
           }
     }
    
        3
  •  0
  •   user1576270    11 年前

    这是我见过的最简单的代码。

    var previous_response_length = 0
      , xhr = new XMLHttpRequest();
    
    xhr.open("GET", "http://127.0.0.1:7379/SUBSCRIBE/hello", true);
    xhr.onreadystatechange = checkData;
    xhr.send(null);
    
    function checkData() {
      if(xhr.readyState == 3) {
        response = xhr.responseText;
        chunk = response.slice(previous_response_length);
        previous_response_length = response.length;
        console.log(chunk);
      }
    };