2015-11-17 250 views
1

我有一個基於網絡套接字的聊天應用程序(HTML5)。當代理服務器關閉時,網絡套接字連接關閉

瀏覽器通過wss打開與基於java的web套接字服務器的套接字連接。

當瀏覽器直接連接到服務器(沒有任何代理)時,一切正常。

但是,當瀏覽器位於企業代理的後面時,大約2分鐘的無活動後,瀏覽器套接字連接會自動關閉。 瀏覽器控制檯顯示「套接字關閉」。

在我的測試環境中,我有一個Squid-Dansguardian代理服務器。

IMP:如果瀏覽器沒有任何代理連接,則不會執行此行爲。

爲了保持一些活動,我嵌入了一個簡單的jquery腳本,它將每60秒向另一個服務器發出一個http GET請求。但它沒有幫助。大約2分鐘沒有動作後,我的瀏覽器控制檯仍然「關閉了套接字」。

歡迎任何幫助或指針。

謝謝

+0

代理是否支持或過濾出wss:協議?我知道我們的公司代理不知道如何處理它,所以流量不通過。 –

+0

你需要一個回退機制,所以當wss沒有通過時,你可以回退到長輪詢或其他事情,這需要在服務器和客戶端上工作。 –

+0

快速注意:如果有持續的聊天活動,那麼套接字不會關閉。只有在沒有活動(聊天消息)約2分鐘時,套接字纔會自動關閉。 –

回答

1

檢查squid.conf中的request_timeout值。你可以通過request_timeout來改變它。這不僅會影響網絡套接字。例如,在我經常使用的環境中,會打一個perl腳本來生成各種配置。執行可能需要5-10分鐘才能完成。我們的httpd和squid服務器上的超時值必須提高以彌補這一點。

另外,請查看connect_timeout值。這是默認爲一分鐘..

+0

謝謝@ user5565110檢查....我會在10分鐘內發佈更新。 –

+0

我的squid.conf沒有定義request_timeout。既不connect_timeout。再次考慮,對我的情況來說,依靠squid參數可能不是一個好主意,因爲我無法控制客戶端的代理設置和配置。因此,可能需要在套接字內發送一些虛擬請求以保持活動狀態。 –

+0

如果沒有定義超時,則request_tmeout上的默認值爲2分鐘,connect_timeout上的默認值爲1分鐘...我會提出request_timeout。另外,正如你所提到的,實施ping/pong類型的場景是個好主意。在我的一個網絡套接字實現中,我只是使用基本上由RFC6455強制執行的ping/pong方法。 –

2

這對我來說似乎是功能,而不是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攻擊的情況(所有可用的文件句柄將用於無效舊的連接,你會不會有空間給新的連接)。