1

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

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

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

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

4

1 回答 1

2

不幸的是,没有简单的解决方案。这是 Play 的 github 上的一个问题。具体来说,Play 无法推断连接自行丢失。

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

我对 Java websocket API 不太熟悉,但抽象地说,您只想记录服务器上的最后一次通信时间,并让线程/参与者/计划任务清理旧连接。然后,为了保持连接处于活动状态,请在套接字上运行 ping。我们在客户端启动 ping(但在服务器上也可以),如果服务器在 2 秒内没有 pong,则客户端断开连接并重新连接。

于 2014-02-13T16:59:09.393 回答