服务器上的WebSocket连接状态

时间:2014-02-09 02:19:28

标签: playframework websocket playframework-2.2 java-websocket

我正在使用Play Framework 2.2.1来处理WebSocket连接。

通常,当客户端故意关闭连接时(通过调用close函数)或者由于客户端崩溃等不需要的事件而关闭连接时,将调用以下onClose函数。

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

此处的问题是,有时,如果发生意外事件,则不会调用onClose回调。从服务器的角度来看,客户端看起来仍然是连接的。处理这个问题的最佳方法是什么?我应该像每秒一样ping客户端以查看他在线,还是从客户端到服务器ping?

1 个答案:

答案 0 :(得分:2)

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

在Play支持读取/空闲超时之前,您可以自己实现它们。我们的浏览器扩展保持持久的websocket连接,并且每隔 x 秒运行应用程序级ping。如果线路已经安静太长时间,客户端和服务器都可以启动断开连接。

我不熟悉Java websocket API,但是抽象地说,你只想记录服务器上的最后一次通信时间,并让线程/角色/计划任务清理旧连接。然后,为了使连接保持活动状态,请在套接字上执行ping操作。我们在客户端启动ping(但在服务器上也可以工作),如果服务器在2秒内没有拨打,客户端将断开连接并重新连接。