亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App(六)

Pocher / 1339人閱讀

摘要:實(shí)現(xiàn)聊天,項(xiàng)目介紹。本章將給聊天加上心跳機(jī)制。這對(duì)于一些服務(wù)型的程序來(lái)說(shuō),是災(zāi)難性的后果,將會(huì)導(dǎo)致服務(wù)端資源耗盡。繼承,并重寫(xiě)其方法。對(duì)進(jìn)行強(qiáng)制履行轉(zhuǎn)換后,通過(guò)判斷其狀態(tài),只有當(dāng)其該處于讀寫(xiě)空閑的時(shí)候才將這個(gè)關(guān)閉。

Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹。

Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目github鏈接。

本章完整代碼鏈接。

本章將給聊天App_PigChat加上心跳機(jī)制。



為什么要實(shí)現(xiàn)心跳機(jī)制

如果沒(méi)有特意的設(shè)置某些選項(xiàng)或者實(shí)現(xiàn)應(yīng)用層心跳包,TCP空閑的時(shí)候是不會(huì)發(fā)送任何數(shù)據(jù)包。也就是說(shuō),當(dāng)一個(gè)TCP的socket,客戶端與服務(wù)端誰(shuí)也不發(fā)送數(shù)據(jù),會(huì)一直保持著連接。這其中如果有一方異常掉線(例如死機(jī)、路由被破壞、防火墻切斷連接等),另一端如果沒(méi)有發(fā)送數(shù)據(jù),永遠(yuǎn)也不可能知道。這對(duì)于一些服務(wù)型的程序來(lái)說(shuō),是災(zāi)難性的后果,將會(huì)導(dǎo)致服務(wù)端socket資源耗盡。

舉個(gè)簡(jiǎn)單的例子,當(dāng)我們因?yàn)樘厥馇闆r打開(kāi)飛行模式 ,在處理完事件之后再關(guān)閉飛行模式,這時(shí)候如果再進(jìn)入應(yīng)用程序中,我們將以新的channel進(jìn)入,但是之前的channel還是會(huì)保留。

因此,為了保證連接的有效性、及時(shí)有效地檢測(cè)到一方的非正常斷開(kāi),保證連接的資源被有效的利用,我們就會(huì)需要一種?;畹臋C(jī)制,通常改機(jī)制兩種處理方式:

1、利用TCP協(xié)議層實(shí)現(xiàn)的Keepalive;

2、自己在應(yīng)用層實(shí)現(xiàn)心跳包。



實(shí)現(xiàn)心跳機(jī)制

新建一個(gè)HeartBeatHandler用于檢測(cè)channel的心跳。

繼承ChannelInboundHandlerAdapter,并重寫(xiě)其userEventTriggered方法。當(dāng)客戶端的所有ChannelHandler中4s內(nèi)沒(méi)有write事件,則會(huì)觸發(fā)userEventTriggered方法。

首先我們判斷evt是否是IdleStateEvent的實(shí)例,IdleStateEvent用于觸發(fā)用戶事件,包含讀空閑/寫(xiě)空閑/讀寫(xiě)空閑。

對(duì)evt進(jìn)行強(qiáng)制履行轉(zhuǎn)換后,通過(guò)state判斷其狀態(tài),只有當(dāng)其該channel處于讀寫(xiě)空閑的時(shí)候才將這個(gè)channel關(guān)閉。

/**
 * @Description: 用于檢測(cè)channel的心跳handler 
 *                  繼承ChannelInboundHandlerAdapter,從而不需要實(shí)現(xiàn)channelRead0方法
 */
public class HeartBeatHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        
        // 判斷evt是否是IdleStateEvent(用于觸發(fā)用戶事件,包含 讀空閑/寫(xiě)空閑/讀寫(xiě)空閑 )
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent)evt;        // 強(qiáng)制類型轉(zhuǎn)換
            
            if (event.state() == IdleState.READER_IDLE) {
                System.out.println("進(jìn)入讀空閑...");
            } else if (event.state() == IdleState.WRITER_IDLE) {
                System.out.println("進(jìn)入寫(xiě)空閑...");
            } else if (event.state() == IdleState.ALL_IDLE) {
                
                System.out.println("channel關(guān)閉前,users的數(shù)量為:" + ChatHandler.users.size());
                
                Channel channel = ctx.channel();
                // 關(guān)閉無(wú)用的channel,以防資源浪費(fèi)
                channel.close();
                
                System.out.println("channel關(guān)閉后,users的數(shù)量為:" + ChatHandler.users.size());
            }
        }
        
    }
    
}



增加心跳支持

在原來(lái)的WSServerInitialzer中增加心跳機(jī)制的支持。

        
        // ====================== 增加心跳支持 start    ======================
        // 針對(duì)客戶端,如果在1分鐘時(shí)沒(méi)有向服務(wù)端發(fā)送讀寫(xiě)心跳(ALL),則主動(dòng)斷開(kāi)
        // 如果是讀空閑或者寫(xiě)空閑,不處理
        pipeline.addLast(new IdleStateHandler(8, 10, 12));
        // 自定義的空閑狀態(tài)檢測(cè)
        pipeline.addLast(new HeartBeatHandler());
        // ====================== 增加心跳支持 end    ======================
        
        

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73339.html

相關(guān)文章

  • Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App詳解(四)

    Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹。Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目github鏈接。本章完整代碼鏈接。 本章內(nèi)容 (1) 查詢好友列表的接口 (2)通過(guò)或忽略好友請(qǐng)求的接口 (3)添加好友功能展示 查詢好友列表的接口 /** * @Description: 查詢我的好友列表 ...

    why_rookie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<