javax.websocket.Session.isOpen()方法如何工作?

时间:2016-07-05 09:18:04

标签: java-ee websocket tyrus

假设我们在客户端和javaee服务器之间打开了websocket。有一个方法session.isOpen(),可用于检查会话是否仍处于打开状态。但是什么将返回此方法以及为什么如果客户端计算机突然关闭或用户离开页面但我们的js脚本没有关闭连接。这种方法有多可靠?

2 个答案:

答案 0 :(得分:0)

简短回答

当用户离开页面时,浏览器应该关闭任何WebSockets连接。因此,Session#isOpen()方法应返回false

如果容器处于非活动状态(没有发送或接收消息),您始终可以使用Session#setMaxIdleTimeout(long)方法设置容器关闭会话之前的毫秒数。当浏览器没有按预期关闭连接时,这很有用。

答案很长

当前的HTML Live Standard定义了关于unloading documents的以下内容:

  

此规范定义了以下卸载文档清理步骤。其他规格可以定义更多。

     
      
  1. 消除由WebSocket WebSocket() Document对象中Window构造函数创建的所有WebSocket个对象。如果这会影响任何Document个对象,请将Document的可抢救状态设置为false。

  2.   
  3. 如果EventSource的可抢救状态为false,则强行关闭从Document' {Window' {Document {{{ {1}}对象。

  4.   
  5. 如果Document的可抢救状态为false,请清空Window的{​​{1}}活动计时器列表。

  6.   

关于making disappear WebSocket objects,定义如下:

  

如果要使用户代理消失WebSocket对象(当Document对象消失时会发生这种情况),则用户代理必须遵循以下列表中的第一组适当的步骤:< / p>      

      
  • 如果尚未建立WebSocket连接

         
        
    • 使WebSocket连接失败。
    •   
  •   
  • 如果尚未启动WebSocket关闭握手

         
        
    • 启动WebSocket关闭握手,在WebSocket关闭消息中使用的状态代码为1001
    •   
  •   
  • 否则

         
        
    • 什么都不做。
    •   
  •   

换句话说,当你离开页面时,浏览器应该关闭WebSockets连接。

RFC 6455为此情况定义了1001状态代码:

  

7.4.1. Defined Status Codes

     

端点可以在发送时使用以下预定义的状态代码     关闭框架。

     
      
  • <强> 1000

         

    1000表示正常闭包,意味着目的   已建立连接已经完成。

  •   
  • <强> 1001

         

    1001表示端点正在消失,例如服务器   下降或浏览器已离开页面。

  •   
     

[...]

您可以在下方找到有关Chrome和Firefox中报告的问题的更多详细信息:

答案 1 :(得分:0)

如果WebSocket连接处于活动状态-即能够创建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。