2014-02-09 151 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,客戶端將斷開連接並重新連接。

相關問題