Playframework Comet套接字在客户端捕获断开连接

时间:2012-10-18 06:18:26

标签: javascript jquery playframework playframework-2.0

所以我实现了一个需要实时向浏览器发送消息的应用程序。目前这个工作正常。当我收到消息时,我是一个类似于时钟示例的无类型演员。

我的问题是,我希望能够在彗星插座断开连接时重新连接网页。目前在带有彗星插座的镀铬装置中,装载图标不断旋转。有没有办法可以捕获iframe / comet套接字的断开连接消息?或者有什么我可以在javascript / jquery中查询?那么我可以重新加载页面吗?

1 个答案:

答案 0 :(得分:0)

如果要重新连接“网页”(换句话说,让浏览器向服务器发送另一个请求,使用window.location.reload()或其他方法),标准play.libs.Comet.onDisconnected处理程序是没有用的对你来说 - 它的域是服务器端,而不是客户端。

要让客户端自行管理可能的停电,您可能需要实施“心跳”方案。当自上一条消息以来经过了太多时间后,客户端应用程序将ping您的服务器。一种可行的方法:

var CometProcessor = {
  processMessage:         function(message) {
    console.log(message);
  },
  handleHeartbeatTimeout: function() {
    alert('Heartbeat process timeout');
  },
  handleHeartbeatError: function() {
    alert('Heartbeat process error');
  },

  timeoutPeriod:  10000,      // in milliseconds
  timeoutId:      0,          // will contain an ID of the current 'checking' timeout
  checkHandler:   null,       // will contain a link to XHR object

  checkBeat: function() {
    // storing the reference to created XHR object:
    this.checkHandler = $.ajax({
      url:     your_server_url,
      // set it to the URL of ping script, that will respond instantly

      timeout:     1000,
      // this is configurable, but obviously it makes little sense setting this param
      // higher than `timeoutPeriod`

      success:     $.proxy(function() {
        // so this particular heartbeat request check went through ok,
        // but the next may not be so lucky: we need to schedule another check
        this.timeoutId = window.setTimeout(
          $.proxy(this.checkBeat, this), this.timeoutPeriod);
      }, this),

      error:       $.proxy(function(x, t) {
        if (t === 'timeout') {
          this.handleHeartbeatTimeout();
        }
        else {
          this.handleHeartbeatError();
        }
      }, this)
    });
  },

  message: function(message) {
    // when we receive a message, link is obviously functioning,
    // so we need to stop all the checking procedures
    if (this.checkHandler) {
      this.checkHandler.abort();
      window.clearTimeout(this.timeoutId);
      this.checkHandler = null;
    }
    processMessage(message); // this is where the actual processing takes place

    // when we done with processing, we need to setup the heartbeat again:
    this.timeoutId = window.setTimeout(
      $.proxy(this.checkBeat, this), this.timeoutPeriod);
  }
};

在服务器端利用此对象非常简单:您只需要替换this example中类似的行...

Ok.stream(events &> Comet(callback = "parent.cometMessage"))

......用这个:

Ok.stream(events &> Comet(callback = "parent.CometProcessor.message"))