websocket 心跳重連 (通訊檢測)
最近做專案,用到websocket來做訊息的實時推送。在做這個專案之前,websocket的相關內容沒有接觸過,只限於知道有這個東西。對於這個websocket,一切都是從零開始。所以做這個專案前有去搜索了一些關於websocket的技術知識。
websocket的基本事件有onopen、onmessage、onerror、onclose這四個事件,onopen是連線已開啟,且可以通訊,onmessage是收到訊息,onerror是websocket發生錯誤,onclose是websocket連線關閉。在這以上的四個事件中,我們做各種事件處理。
在這次專案中,websocket都能夠很好地執行工作,但是今天發現有的手機進入頁面後,並且放置一段時間(未關閉頁面),再次瀏覽該頁面,會發現該頁面收不到來自伺服器的推送,一開始我是以為有websocket自帶的onclose或onerror的事件,能夠檢測出來websocket是否線上。後來多次測試後發現websocket其實已經斷開連線了,只是瀏覽器未發現websocket已經斷開(也就是響應超時
解決這個問題的辦法就是使用心跳檢測機制,開始做專案之前,也知道心跳檢測機制的存在,但是由於是第一次做,連線不深,以為用不到這個。
心跳檢測,用我自己的話來說,就是為了檢測客戶端與服務端的連線是否能存活。
第一,心跳檢測包由客戶端(瀏覽器)定時向服務端(後端)傳送約定好的訊息格式,告訴服務端客戶端線上,服務端收到訊息後立即返回一個訊息,告訴客戶端長連線沒問題,可以正常使用。
第二,心跳檢測也可以用來檢測後端是否正常,如果在連線正常的情況下,服務端並未能在設定的時間內返回特定訊息,說明可能當前後端異常,當前連線不可用,客戶端可以嘗試重新建立websocket連線來重試。
實現心跳檢測的方法思路算是比較簡單,主要是通過定時向伺服器send()相關訊息,並且定下心跳包的超時時間,當收到伺服器返回的訊息時,清掉當前心跳計時器以及重連超時的定時器。若服務端未能夠及時返回特定訊息,超過設定的超時時間時,主動關閉當前websocket連線,並且嘗試重新建立新的websocket連線。
以下為我在專案中的部分程式碼,以供參考: