2014-02-09 155 views
1

我正在使用Play Framework 2.2.1来处理WebSocket连接。服务器上的WebSocket连接状态

通常,当连接被客户端关闭(通过调用close函数)或者被不需要的事件(如客户端崩溃)关闭时,会调用以下onClose函数。

socketIn.onClose(new F.Callback0() { 
        public void invoke() { 
          // Send a Quit message 
         } 
         }); 

这里的问题是,有时,在不需要的事件的情况下,回调的OnClose不叫。从服务器的角度来看,客户端看起来仍然是连接的。处理这个问题的最好方法是什么?我应该每秒钟ping客户端以查看他在线还是从客户端到服务器ping?

+0

在您的应用程序中,您的websocket连接可能会长时间处于空闲状态,这意味着长时间没有任何方向的流量? – mantithetical

回答

2

不幸的是,没有简单的解决方案。 Here's a issue about it on Play's github。具体来说,Play不可能推断连接本身就会丢失。

直到Play支持读取/空闲超时,您可以自己实现它们。我们的浏览器扩展保持持久的websocket连接,并且我们每运行一个应用程序级别ping,就会每秒钟处理一次。如果线路安静过久,客户端和服务器都可以启动断开连接。

我对Java websocket API并不熟悉,但抽象地说,您只是想记录服务器上最后一次通信时间,并让线程/ actor /计划任务清理旧连接。然后,为了保持连接正常,请在套接字上运行ping命令。我们在客户端启动ping(但在服务器上也是如此),并且如果服务器在2秒内没有ping,客户端将断开连接并重新连接。

相关问题