2013-03-01 24 views
4

服务器如何知道如何在以下情况和其他情况下关闭HTML5中的Web套接字连接。HTML 5 - 浏览器上的Web套接字关闭

  1. 浏览器突然关闭
  2. 刷新浏览器(新的套接字连接建立或者它仍然会使用现有的连接)
  3. 系统突然断电
+0

结账保持活力。 http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html – nycynik 2013-03-07 14:58:29

回答

0

你的问题的最容易的部分是浏览器刷新部分。 IE,FF和Chrome将关闭打开的连接并打开一个新连接。我想,其他任何浏览器都会这样做。

点1和3我只能猜测:如果客户端仍然可以干净地关闭tcp连接,服务器将立即识别出连接已关闭。如果您正在使用tomcat,则将调用MessageInbound实例的onClose方法。

如果客户端无法干净地关闭tcp连接,服务器将等待某种超时。服务器在尝试向套接字写入内容时肯定会超时。你可以实现一个心跳机制来做到这一点。 Websockets似乎可以选择自动心跳,但并不是所有的浏览器和服务器都支持它。

1

如果客户端退出而不能通知服务器,TCP实现的基本特征定义了行为。

只要你的应用程序(和主机系统本身)不试图通过这个断开的连接发送任何数据,主机就不会意识到有什么问题。因此,从服务器的角度来看,连接可能会长时间处于“打开”状态并分配资源。

但是,在试图将数据发送到远端时,远端将不会确认检索并且TCP重传发挥作用。它涉及一定数量的重复和使用超时。确切的参数取决于实现(正在使用的操作系统)。当重传最终失败时,TCP连接关闭,资源在服务器端释放。所以,你可以

  • 依赖这样的事实,在某些时候你的应用程序可能需要写入缺少远端,并且同时也引发了死连接的检测
  • 检测缺少远程结束自己通过在应用程序级别使用类似ping的东西
  • 通过TCP保持技术在操作系统级别上使用类似ping的东西。
0

如果用户使用打开的Web套接字关闭浏览器选项卡,服务器将不知道该服务器已被立即关闭。但是,正如Jan-Philip所说,如果您尝试编写操作将会失败,并使用给出的错误知道连接的当前状态。

例如,当使用ws lib for nodejs时,如果您尝试将数据发送到已关闭的websocket,则会引发异常,并显示类似[Error:not opened]的错误。他们你知道连接不再存在,你可以做任何需要的清理。