2012-03-09 64 views
1

我有一個Web應用程序,它依賴於來自服務器的更新信息。過去,客戶端會在完成前1000ms後發送ajax請求。它運作良好,但浪費資源。當客戶端支持該應用程序時,該應用程序已轉換爲使用websocket(如果不支持,則會降級爲Ajax)。是否需要重申websocket連接?

在過去,通過AJAX指示瀏覽器被清涼活性每秒提供一個脈衝。現在,它看起來死了,只是在那裏工作。我有以下幾點:

function connect() { 
    $("#text1").text('Socket Status: '+socket.readyState+' (connecting)'); 
    socket.onopen = function(){ 
     $("#text1").text('Socket Status: '+socket.readyState+' (open)'); 
    } 
    socket.onmessage = function(msg){ checkDATA(msg.data); } 
    socket.onclose = function(){ 
     $("#text1").text('Socket Status: '+socket.readyState+' (close)'); 
     setTimeout(function() { connect(); },500); 
    } 
    socket.onerror = function(){ 
     $("#text1").text('Socket Status: '+socket.readyState+' (error) '+msg.data); 
    } 
} 

所以我有狀態的一些指示,但沒有顯示的脈衝。我應該僞造一個脈衝,還是有一些不同的/更好的,可以/應該做的,以確保連接工作?

回答

1

底下,一個WebSocket的只是一個TCP套接字。所以,首先你應該監控所有可能的錯誤情況和套接字通知。然後,第二,如果你想確定地知道套接字還活着,你將不得不發送一個常規的數據並尋找服務器響應。

你應該注意到,在電池供電的設備(手機,平板電腦,筆記本電腦),常規的網絡心跳可對電池顯著漏除非有心跳之間的很長一段時間的持續時間。

另一種方法是實現非常聰明的錯誤處理髮送和某種智能檢測接收到的數據。對於發送,如果您發送一些數據並發現錯誤,因爲套接字看起來不可操作,那麼您可以自動關閉連接並創建一個新連接並嘗試再次發送數據。與此相關的一個問題是,您必須小心謹慎地編寫代碼,以避免發生錯誤時出現任何類型的循環,重新創建套接字,發生錯誤,重新創建套接字,一遍又一遍。通常情況下,您只需重試少量次數(2-3次),並隔出連續重試之間的時間。

對於接收,如果您希望每隔一段時間(至少每隔15分鐘)從服務器獲取一次更新並且自上次更新以來的時間已經過去,那麼您可能需要測試現有的連接以查看它是否仍然存在。

使用這種類型的技術的優點是,當事情正常工作時,您不再需要使用更多的傳輸/電池,但您仍然有一些故障檢測/處理方案來自動檢測連接可能會遇到麻煩並自動恢復。

+0

什麼錯誤(S)我不能監控?我將這個函數封裝在'try {} catch {}'中,當服務器重新啓動時引發火災。 'Catch'等待5秒鐘並嘗試重新連接。我刪除了重新連接'onerror',因爲每次出現錯誤時,我都將服務器的連接數加倍。如果我明白瀏覽器爲什麼/如何更改連接狀態,測試連接似乎是可以避免的。 – shaun5 2012-03-18 03:36:04