假设我们在客户端和javaee服务器之间打开了websocket。有一个方法session.isOpen(),可用于检查会话是否仍处于打开状态。但是什么将返回此方法以及为什么如果客户端计算机突然关闭或用户离开页面但我们的js脚本没有关闭连接。这种方法有多可靠?
答案 0 :(得分:0)
当用户离开页面时,浏览器应该关闭任何WebSockets连接。因此,Session#isOpen()
方法应返回false
。
如果容器处于非活动状态(没有发送或接收消息),您始终可以使用Session#setMaxIdleTimeout(long)
方法设置容器关闭会话之前的毫秒数。当浏览器没有按预期关闭连接时,这很有用。
当前的HTML Live Standard定义了关于unloading documents的以下内容:
此规范定义了以下卸载文档清理步骤。其他规格可以定义更多。
消除由
WebSocket
WebSocket()
Document
对象中Window
构造函数创建的所有WebSocket
个对象。如果这会影响任何Document
个对象,请将Document
的可抢救状态设置为false。如果
EventSource
的可抢救状态为false,则强行关闭从Document
' {Window
' {Document
{{{ {1}}对象。- 醇>
如果
Document
的可抢救状态为false,请清空Window
的{{1}}活动计时器列表。
关于making disappear WebSocket
objects,定义如下:
如果要使用户代理消失
WebSocket
对象(当Document
对象消失时会发生这种情况),则用户代理必须遵循以下列表中的第一组适当的步骤:< / p>
如果尚未建立WebSocket连接
- 使WebSocket连接失败。
如果尚未启动WebSocket关闭握手
- 启动WebSocket关闭握手,在WebSocket关闭消息中使用的状态代码为
1001
。否则
- 什么都不做。
换句话说,当你离开页面时,浏览器应该关闭WebSockets连接。
RFC 6455为此情况定义了1001
状态代码:
端点可以在发送时使用以下预定义的状态代码 关闭框架。
<强>
1000
强>
1000
表示正常闭包,意味着目的 已建立连接已经完成。<强>
1001
强>
1001
表示端点正在消失,例如服务器 下降或浏览器已离开页面。[...]
您可以在下方找到有关Chrome和Firefox中报告的问题的更多详细信息:
答案 1 :(得分:0)
javax.websocket.Session#isOpen()
,则 javax.websocket.Session
将返回true。如果您在特定的javax.websocket.Session#close()
上调用Session
,然后在同一会话上调用javax.websocket.Session#isOpen()
,它将始终返回true,因为基础WebSocket仍将处于活动状态并能够创建新的{{ 1}}。模棱两可,不是吗?
但是,在您Session
然后致电javax.websocket.Session#close()
之后,您会发现计数会减少。
简而言之-如果WebSocket连接处于活动状态,则session.getOpenSessions().size()
始终返回true。