【问题标题】:How can Node.js detect browser side has ended one HTTP session?Node.js 如何检测浏览器端已经结束了一个 HTTP 会话?
【发布时间】:2012-09-14 18:11:14
【问题描述】:

我正在尝试使用 Node.js 实现 Comet(XHR 流)。由于 XHR Streaming 使客户端 XHR.responseText 不断增长,因此需要客户端关闭当前 XHR 并重新启动 XHR Streaming。

在服务器端,对于每个 XHR 流,应该保留 http.ServerResponse 对象直到 HTTP 会话结束。

问题是:Node.js如何检测浏览器端已经结束了一个HTTP会话?

我认为,理想情况下,http.ServerResponse.write 有一个回调参数。因此,写入已关闭的 HTTP 会话将触发回调并让我们知道它已中止。但是,没有这样的回调参数。

【问题讨论】:

    标签: node.js xmlhttprequest comet


    【解决方案1】:

    我认为http://socket.io/ 可以满足您对client.on('disconnect', function(){ … }) 的需求

    【讨论】:

      【解决方案2】:

      req.socket 似乎不是已发布的属性。我用过:

      res.connection.on('close', function() {
      ...  
      });
      

      【讨论】:

        【解决方案3】:

        正如@macarthy 已经提到的:socket.io 是使用 node.js 实现彗星的方式。

        但是,如果您希望自己实现 XHR Streaming,则应该在每个 http.ServerResponse 上都有一个名为“end”的事件。此事件在每个会话中触发一次,不带任何参数来通知您的应用程序已关闭响应。

        【讨论】:

          【解决方案4】:

          我总是使用类似的东西..

          var server = http.createServer(function(req, res) {
              req.socket.addListener("end", function() {
                ///he gone
              });
          });
          

          【讨论】:

          • 开启 HTTP Keep-alive 是否有效?一个套接字连接可能服务于多个 http 会话。
          • 我不能肯定地说,但由于套接字位于 http 堆栈之上,我认为这并不重要。
          猜你喜欢
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 2012-02-11
          • 2013-07-18
          • 2017-09-05
          • 1970-01-01
          • 2010-11-29
          • 2019-07-15
          相关资源
          最近更新 更多