Netty心跳檢測

Netty心跳檢測

Netty給我們提供三個Handler,分別是IdleStateHandler、ReadTimeoutHandler、WriteTimeOutHandler,主要目的是檢查對方是否還在線

為什么需要心跳機制
  • TCP協(xié)議適用于客戶端數(shù)量相對較少,并且頻繁通信的業(yè)務場景;HTTP協(xié)議使用與客戶端數(shù)量比較大的業(yè)務場景;HTTP是短鏈接,請求完成后會釋放連接資源,不占用服務器資源,但是TCP連接成功則可以多次請求,不會釋放,除非特殊原因?qū)е逻B接失敗

  • 長鏈接不會釋放鏈接資源,那么很多客戶端只是完成了連接,但是沒有實際的業(yè)務請求操作,那么服務器的資源還是被占用,導致服務器性能下降。

三個核心類
IdleStateHandler 當連接空閑時間(讀或?qū)懀┨L時,將觸發(fā) IdleStateEvent 事件,可以通過 ChannelInboundHandler 中重寫 userEventTrigged 方法來處理該事件。
ReadTimeoutHandler 如果在指定的時間之內(nèi)沒有發(fā)生讀事件,就會拋出這個異常,并且自動關(guān)閉連接。可以在 exectionCaught 方法中處理這個異常。
WriteTimeoutHandler 如果在指定的時間之內(nèi)沒有發(fā)生寫事件,拋出次異常,并且關(guān)閉連接??梢栽?exectionCaught 方法中處理這個異常。

服務端

 pipeline.addLast(new LoggingHandler(LogLevel.DEBUG));

 //5秒鐘之內(nèi)沒有 讀事件 則斷開連接
 pipeline.addLast(new ReadTimeoutHandler(5,TimeUnit.SECONDS));
 //字符串解碼器
 pipeline.addLast(new StringDecoder(Charset.forName("GBK")));

 //字符串編碼器
 pipeline.addLast(new StringEncoder(Charset.forName("GBK")));

 //業(yè)務Handler
 pipeline.addLast(new HeartBeatHandler());


public class HeartBeatHandler extends ChannelInboundHandlerAdapter {
 @Override
 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
 System.out.println("channelRead>>>"+msg+">>>"+ LocalDateTime.now());
 }

 @Override
 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
 System.out.println("exceptionCaught>>>"+cause.getMessage());
 }
}

客戶端


ch.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
 // 解碼轉(zhuǎn)String,注意調(diào)整自己的編碼格式GBK、UTF-8
ch.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));

 //實例:延遲 1 秒鐘,每個 15 秒鐘往服務端發(fā)送一次 hello world。
 //心跳檢測http://www.imooc.com/wiki/nettylesson/netty25.html
 f.channel().eventLoop().scheduleWithFixedDelay(() -> {
 f.channel().writeAndFlush("hello world!");
 }, 1, 15, TimeUnit.SECONDS);

代碼說明

  • 客戶端每個15秒發(fā)送一次數(shù)據(jù),

  • 服務端如果5秒之內(nèi)沒有讀事件,則自動端口連接

  • 因為每次都是隔15秒發(fā)送,客戶端每次發(fā)送的數(shù)據(jù)都是超時了,因此,連接會被斷開

更改代碼

 f.channel().writeAndFlush("hello world!");
 }, 1, 1, TimeUnit.SECONDS);

服務端執(zhí)行結(jié)果

FRVVh.png

參考
慕課網(wǎng)Netty心跳檢測

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容