2017-04-26 29 views
0

我們正在使用自己的通知系統構建聊天室,而不依賴GCM,但需要服務人員+ SSE。 在桌面上它很好,但在移動android應用程序(它使用科爾多瓦人行橫道,鉻53)。 長時間運行的通知連接在20-30分鐘後停滯,並處於前臺活動狀態。 它不會因爲錯誤而死亡,只是不會收集數據。根本沒有錯誤,這很奇怪。無法重新連接,因爲我們不知道連接是否已經死亡。Android上的Chrome瀏覽器:連接在30分鐘後死機

什麼是最乾淨的方式?每5分鐘重新啓動連接是一個想法,但它不乾淨。 代碼

runEvtSource(url, fn) { 
if (this.get('session.content.isAuthenticated') === true) { 
    var evtSource = new EventSource(url, { 
    withCredentials: true 
    }); 
}} 

侵略性重新連接代碼

var evtSource = this.runEvtSource(url, fn) 
var evtSourceErrorHandler = (event) => { 
    var txt; 
    switch (event.target.readyState) { 
    case EventSource.CONNECTING: 
     txt = 'Reconnecting...'; 
     evtSource.onerror = evtSourceErrorHandler; 
     break; 
    case EventSource.CLOSED: 
     txt = 'Reinitializing...'; 
     evtSource = this.runEvtSource(url, fn) 
     evtSource.onerror = evtSourceErrorHandler; 
     break; 
    } 
    console.log(txt); 
evtSource.onerror = evtSourceErrorHandler 
+0

您是否定期嘗試(小於您似乎遇到的超時)發送數據以保持連接活着? – gzost

+0

nope我還沒有嘗試過,這意味着發送假數據? –

+1

真的不是「假」數據,而是具有保持連接活動的唯一目的的數據(通常稱爲ping/pong)。 – gzost

回答

1

我通常在所述SSE連接的頂部添加保活層。它不會經常發生,但套接字可能會死亡而不會正常死亡,因此您的連接會變得安靜,並且不會出現錯誤。

因此,一種方式是,你獲取數據函數中:

if(timer)clearTimeout(timer); 
timer = setTimeout(reconnect, 30 * 1000); 
...process the data 

換句話說,如果在30秒內,因爲你最後得到的數據,重新連接。根據您發送的數據的頻率選擇一個值:如果10%的時間內數據事件之間存在60秒的間隔,但從未存在120秒的間隔,則將超時設置爲高於120秒的值是有意義的。

您可能還想通過將常規消息從服務器推送到客戶端來保持活動狀態。如果來自服務器的消息頻率非常不規則,這是一個好主意。例如。我可能會讓服務器每30秒發送一次當前時間戳,並在客戶端上使用45秒的保持活動超時時間。另外,如果這是一個移動應用程序,請記住,如果用戶會意識到減少接收聊天消息延遲的好處,並減少電池壽命縮短的問題。

+0

當我檢查,連接仍然活着,但數據只是不來或去。這是由於'插槽可以死在沒有正常死亡'在鉻爲移動機器人?我想深入分析這一點。任何斷開事件或錯誤事件由於重新嘗試重新連接而重新連接。只是保持沉默而沒有錯誤的連接。 –

+1

@PhyoArkarLwin是的,這就是問題的樣子。例如。您的客戶端和服務器之間的路由器之一決定放棄連接(在移動的情況下,可能僅僅是因爲它已經打開很長時間),崩潰或重新啓動。 –

+0

已更新侵略性重新連接代碼。對於路由器斷開代碼修復的決定 - 當網絡問題發生時,它會嘗試重新連接,我已經用特定的ISP測試了一個特定的ISP,在2-3分鐘後,它會斷開長時間運行的連接,不管它是WebSocket還是任何其他的連接。 '在移動的情況下,也許只是因爲它已經打開了很長時間'我猜這是真實的情況 –

相關問題