一、前言
WebSocket應(yīng)用部署到生產(chǎn)環(huán)境,我們除了會(huì)碰到因?yàn)榻?jīng)過(guò)代理服務(wù)器無(wú)法連接的問題(注:該問題可以通過(guò)搭建WSS來(lái)解決,具體配置請(qǐng)看?WebSocket實(shí)戰(zhàn)之四WSS配置?),另外一個(gè)問題就是外網(wǎng)環(huán)境不穩(wěn)定經(jīng)常會(huì)斷開或者服務(wù)器重啟或者網(wǎng)絡(luò)中間服務(wù)器當(dāng)發(fā)現(xiàn)一個(gè)長(zhǎng)連接長(zhǎng)時(shí)間沒有傳輸數(shù)據(jù)會(huì)斷開,今天我們來(lái)了解一下基于WebSocket如何做心跳重連。
二、PingPong
關(guān)于心跳包的格式,WebSocket協(xié)議RFC6455中有定義控制幀的格式.
Ping幀包含一個(gè)操作碼? 0x9,Pong幀包含一個(gè)操作碼?0xA。
客戶端發(fā)送Ping幀,服務(wù)端收到Ping幀后回一個(gè)響應(yīng)Pong幀。
但是JavaScript 并沒有API支持Ping、Pong幀,而后端JavaEE是有PingPong的支持,這是很奇怪的事情,那我們就通過(guò)自定義消息來(lái)定義心跳包。
三、一個(gè)包含心跳包服務(wù)端推送較完整的例子
1、SpringBoot端代碼
對(duì)?WebSocket實(shí)戰(zhàn)之五JSR356?這篇文章WebSocketServer類進(jìn)行修改,配置一個(gè)定時(shí)器,每隔10秒定時(shí)發(fā)送當(dāng)前時(shí)間,并且在onMessage事件中加上接收心跳包以及發(fā)送心跳包的代碼,服務(wù)端對(duì)心跳處理相對(duì)簡(jiǎn)單。
注:需要使用一個(gè)容器將請(qǐng)求的Session保存起來(lái)并且使用static,否則在發(fā)送信息時(shí)拿不到原來(lái)的那個(gè)session對(duì)象。
2、前端JavaScript代碼
說(shuō)明:
1、所有異常都加上重連代碼,包含創(chuàng)建WebSocket連接、onClose事件、onError事件。
2、在onOpen和onMessage啟動(dòng)心跳包發(fā)送。
3、心跳包發(fā)送方法設(shè)置兩個(gè)延遲器一個(gè)用于發(fā)送心跳包,另外一個(gè)用于當(dāng)服務(wù)端超時(shí)(如果服務(wù)端未超時(shí)會(huì)發(fā)送響應(yīng)心跳包然后重新調(diào)用heartCheck將兩個(gè)延遲器清空)關(guān)閉WebSocket連接。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-729320.html
4、重連代碼時(shí)序:當(dāng)服務(wù)端Down掉或網(wǎng)絡(luò)斷開超過(guò)一定時(shí)間serverTimeoutObj這個(gè)延遲器會(huì)執(zhí)行,然后調(diào)用ws.close()關(guān)閉連接并且觸發(fā)onClose事件,在onClose事件中會(huì)調(diào)用reconnect方法,而reconnect又會(huì)調(diào)用createWebSocket方法,createWebSocket去創(chuàng)建WebSocket連接,當(dāng)創(chuàng)建異常時(shí)又會(huì)再調(diào)用reconnect,一直到能連接得上。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729320.html
到了這里,關(guān)于WebSocket實(shí)戰(zhàn)之六心跳重連機(jī)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!