這對我來說似乎是功能,而不是bug。
在生產應用程序中存在與所謂的「半開放式」插座有關的問題 - see this great blog post about it。
發生這種情況時,連接突然丟失,導致TCP/IP連接斷開而不通知對方連接。這可能會發生許多不同的原因 - 無線信號或蜂窩信號丟失,路由器崩潰,調制解調器斷開,電池芯片,停電...
檢測套接字是否實際打開的唯一方法是嘗試發送數據...但是,您的代理可能無法安全地發送數據而不會干擾您的應用邏輯*。
兩分鐘後,您的代理服務器假定連接已丟失,並關閉套接字以節省資源並允許建立新的連接。
如果代理沒有采取此預防措施,在足夠長的時間線所有可用的資源將要採取的掉線,將永遠關閉,防止您的應用程序訪問。
兩分鐘是一個很多。在Heroku上,他們將代理設置爲50秒(更合理)。對於Http連接,這些超時通常要短得多。
你最好的選擇是保持起的2分鐘時間內發送的WebSocket數據。
Websocket協議通過實施內部ping機制來解決此問題 - 使用它。這些ping應該由服務器發送,瀏覽器直接用pong響應它們(不涉及javascript應用程序)。
的JavaScript API(至少在瀏覽器)不會讓你發送Ping幀(這是一個安全的事情我想,這阻止了人們使用瀏覽器進行DoS攻擊)。
一些開發商(我認爲要misconstructed)通常的做法是實現要麼通過在JSON乒乓球服務器或結果忽視了一個JSON ping消息。
因爲你是在服務器上使用Java,您有機會獲得平安機制,我建議你實現它。
我也建議(如果你有代理的控制權),你將超時降低到更合理的50秒限制。
*生產過程中的實際情況是更加糟糕......
因爲還有很長的中介鏈(家用路由器/調制解調器,NAT,ISP,網關,路由器,負載平衡器,代理。 ..)很可能您的應用程序可以成功發送數據,因爲它仍然與其中一箇中介「連接」。
這應該啓動一個連鎖反應,不僅會一段時間後到達的應用程序,並再次,只有當它試圖發送數據。
這就是爲什麼中國平安幀預期傍幀可以返回(意爲連接的鏈條是完整的。
PS
你或許應該還抱怨Java應用程序沒有關閉連接後一定超時。在生產過程中,這種疏忽可能會迫使你每隔一段時間重新啓動服務器或遇到DoS攻擊的情況(所有可用的文件句柄將用於無效舊的連接,你會不會有空間給新的連接)。
代理是否支持或過濾出wss:協議?我知道我們的公司代理不知道如何處理它,所以流量不通過。 –
你需要一個回退機制,所以當wss沒有通過時,你可以回退到長輪詢或其他事情,這需要在服務器和客戶端上工作。 –
快速注意:如果有持續的聊天活動,那麼套接字不會關閉。只有在沒有活動(聊天消息)約2分鐘時,套接字纔會自動關閉。 –