摘要:實現(xiàn)聊天,項目介紹。本章將給聊天加上心跳機制。這對于一些服務(wù)型的程序來說,是災(zāi)難性的后果,將會導(dǎo)致服務(wù)端資源耗盡。繼承,并重寫其方法。對進行強制履行轉(zhuǎn)換后,通過判斷其狀態(tài),只有當(dāng)其該處于讀寫空閑的時候才將這個關(guān)閉。
Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App,項目介紹。
Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App,項目github鏈接。
本章完整代碼鏈接。
本章將給聊天App_PigChat加上心跳機制。
如果沒有特意的設(shè)置某些選項或者實現(xiàn)應(yīng)用層心跳包,TCP空閑的時候是不會發(fā)送任何數(shù)據(jù)包。也就是說,當(dāng)一個TCP的socket,客戶端與服務(wù)端誰也不發(fā)送數(shù)據(jù),會一直保持著連接。這其中如果有一方異常掉線(例如死機、路由被破壞、防火墻切斷連接等),另一端如果沒有發(fā)送數(shù)據(jù),永遠(yuǎn)也不可能知道。這對于一些服務(wù)型的程序來說,是災(zāi)難性的后果,將會導(dǎo)致服務(wù)端socket資源耗盡。
舉個簡單的例子,當(dāng)我們因為特殊情況打開飛行模式 ,在處理完事件之后再關(guān)閉飛行模式,這時候如果再進入應(yīng)用程序中,我們將以新的channel進入,但是之前的channel還是會保留。
因此,為了保證連接的有效性、及時有效地檢測到一方的非正常斷開,保證連接的資源被有效的利用,我們就會需要一種?;畹臋C制,通常改機制兩種處理方式:
1、利用TCP協(xié)議層實現(xiàn)的Keepalive;
2、自己在應(yīng)用層實現(xiàn)心跳包。
新建一個HeartBeatHandler用于檢測channel的心跳。
繼承ChannelInboundHandlerAdapter,并重寫其userEventTriggered方法。當(dāng)客戶端的所有ChannelHandler中4s內(nèi)沒有write事件,則會觸發(fā)userEventTriggered方法。
首先我們判斷evt是否是IdleStateEvent的實例,IdleStateEvent用于觸發(fā)用戶事件,包含讀空閑/寫空閑/讀寫空閑。
對evt進行強制履行轉(zhuǎn)換后,通過state判斷其狀態(tài),只有當(dāng)其該channel處于讀寫空閑的時候才將這個channel關(guān)閉。
/** * @Description: 用于檢測channel的心跳handler * 繼承ChannelInboundHandlerAdapter,從而不需要實現(xiàn)channelRead0方法 */ public class HeartBeatHandler extends ChannelInboundHandlerAdapter { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { // 判斷evt是否是IdleStateEvent(用于觸發(fā)用戶事件,包含 讀空閑/寫空閑/讀寫空閑 ) if (evt instanceof IdleStateEvent) { IdleStateEvent event = (IdleStateEvent)evt; // 強制類型轉(zhuǎn)換 if (event.state() == IdleState.READER_IDLE) { System.out.println("進入讀空閑..."); } else if (event.state() == IdleState.WRITER_IDLE) { System.out.println("進入寫空閑..."); } else if (event.state() == IdleState.ALL_IDLE) { System.out.println("channel關(guān)閉前,users的數(shù)量為:" + ChatHandler.users.size()); Channel channel = ctx.channel(); // 關(guān)閉無用的channel,以防資源浪費 channel.close(); System.out.println("channel關(guān)閉后,users的數(shù)量為:" + ChatHandler.users.size()); } } } }
在原來的WSServerInitialzer中增加心跳機制的支持。
// ====================== 增加心跳支持 start ====================== // 針對客戶端,如果在1分鐘時沒有向服務(wù)端發(fā)送讀寫心跳(ALL),則主動斷開 // 如果是讀空閑或者寫空閑,不處理 pipeline.addLast(new IdleStateHandler(8, 10, 12)); // 自定義的空閑狀態(tài)檢測 pipeline.addLast(new HeartBeatHandler()); // ====================== 增加心跳支持 end ======================
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73339.html
Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App,項目介紹。Netty+SpringBoot+FastDFS+Html5實現(xiàn)聊天App,項目github鏈接。本章完整代碼鏈接。 本章內(nèi)容 (1) 查詢好友列表的接口 (2)通過或忽略好友請求的接口 (3)添加好友功能展示 查詢好友列表的接口 /** * @Description: 查詢我的好友列表 ...
閱讀 3028·2021-11-24 10:21
閱讀 1598·2021-10-11 10:57
閱讀 2813·2021-09-22 15:24
閱讀 2674·2021-09-22 14:58
閱讀 2336·2019-08-30 13:16
閱讀 3487·2019-08-29 13:05
閱讀 3418·2019-08-29 12:14
閱讀 3456·2019-08-27 10:55