使用 Netty 實(shí)現(xiàn)心跳機(jī)制的關(guān)鍵就是利用?IdleStateHandler?來(lái)產(chǎn)生對(duì)應(yīng)的 idle 事件.
一般是客戶端負(fù)責(zé)發(fā)送心跳的 PING 消息, 因此客戶端注意關(guān)注?ALL_IDLE?事件, 在這個(gè)事件觸發(fā)后, 客戶端需要向服務(wù)器發(fā)送 PING 消息, 告訴服務(wù)器"我還存活著".
服務(wù)器是接收客戶端的 PING 消息的, 因此服務(wù)器關(guān)注的是?READER_IDLE?事件, 并且服務(wù)器的?READER_IDLE?間隔需要比客戶端的?ALL_IDLE?事件間隔大(例如客戶端ALL_IDLE 是5s 沒(méi)有讀寫時(shí)觸發(fā), 因此服務(wù)器的 READER_IDLE 可以設(shè)置為10s)
當(dāng)服務(wù)器收到客戶端的 PING 消息時(shí), 會(huì)發(fā)送一個(gè) PONG 消息作為回復(fù). 一個(gè) PING-PONG 消息對(duì)就是一個(gè)心跳交互.
斷線重連的關(guān)鍵一點(diǎn)是檢測(cè)連接是否已經(jīng)斷開(kāi). 因此我們改寫了 ClientHandler, 重寫了?channelInactive?方法. 當(dāng) TCP 連接斷開(kāi)時(shí), 會(huì)回調(diào) channelInactive 方法, 因此我們?cè)谶@個(gè)方法中調(diào)用 client.doConnect() 來(lái)進(jìn)行重連.