HTML 5 - 浏览器上的 Web 套接字关闭

Posted

技术标签:

【中文标题】HTML 5 - 浏览器上的 Web 套接字关闭【英文标题】:HTML 5 - Web Sockets on Browser close 【发布时间】:2013-03-01 13:04:18 【问题描述】:

在以下场景和其他情况下,服务器如何知道在 html5 中关闭 Web Socket 连接。

    浏览器突然关闭 浏览器刷新(创建新的 Socket 连接,否则仍将使用现有连接) 系统突然断电

【问题讨论】:

签出保持活力。 tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html 【参考方案1】:

如果客户端在无法通知服务器的情况下退出,则由 TCP 实现的基本特征定义行为。

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

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

依赖于这样一个事实,即在某些时候您的应用程序可能想要写入丢失的远程端,并在这样做时触发对死连接的检测 通过在应用程序级别使用类似 ping 的方法自行检测丢失的远程终端 通过 TCP keepalive 技术在操作系统级别使用 ping 之类的东西。

【讨论】:

【参考方案2】:

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

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

如果客户端无法干净地关闭 tcp 连接,服务器将等待某种超时。服务器在尝试向套接字写入内容时肯定会很快超时。您可以实施心跳机制来执行此操作。 Websockets 似乎有自动心跳的选项,但并非所有浏览器和服务器似乎都支持它。

【讨论】:

【参考方案3】:

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

例如,当使用 nodejs 的 ws 库时,如果您尝试将数据发送到已关闭的 websocket,则会引发异常,例如 [错误:未打开]。他们你知道连接不再存在,你可以做任何需要的清理工作。

【讨论】:

以上是关于HTML 5 - 浏览器上的 Web 套接字关闭的主要内容,如果未能解决你的问题,请参考以下文章

浏览器上的 GCDAsyncSocket 立即连接和断开连接,并出现“远程对等方关闭套接字”错误

GetQueuedCompletionStatus 继续选择关闭套接字上的事件

三星 Galaxy S3 Android 浏览器上的 Web 套接字?

python标准库之socket

如何从不支持 HTML5 的旧浏览器绑定到 Web 套接字服务器

php的会话技术