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 套接字?