概述:Netty提供了對心跳機制的天然支持,心跳可以檢測遠程端是否在線
心跳機制的優(yōu)勢:
- 心跳可以檢測遠程端是否在線,
2.心跳可以維持客戶端與服務(wù)器長連接,避免連接被防火墻,路由器關(guān)停等
IdleStateHandler介紹:
public class IdleStateHandler implements ChannelHandler {
//構(gòu)造器
public IdleStateHandler(
long readerIdleTime,
long writeIdleTime,
long allIdleTime,
TimeUnit unit
)
}
構(gòu)造器參數(shù)說明:
- readerIdleTime:為讀超時時間
2.writerIdleTime:為寫超時時間
3.allIdleTime:所有類型的超時時間
使用例子:
new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
/**
* 配置心跳機制
* 說明:每隔五秒檢查channelRead方法,如果五秒內(nèi)該方法沒有被調(diào)用上則會調(diào)用
* userEventTriggered方法。(五秒內(nèi)服務(wù)器沒有返回響應(yīng),可能說明服務(wù)器下線,
* 調(diào)用userEventTriggered方法告知客戶端進行處理)
*/
pipeline.addLast(new IdleStateHeader(5,0,0,TimeUnit.SECONDS));
//配置:發(fā)送數(shù)據(jù)加密coder
pipeline.addLast(new RpcEncoder(new GSONSerializer()));
//配置:接收數(shù)據(jù)解密coder
pipeline.addLast(new RpcDecoder(new GSONSerializer()));
//配置:業(yè)務(wù)處理Handler
pipeline.addLast(clientHandler);
//配置:心跳包Handler
pipeline.addLast(new Pinger());
}
}
IdleStateHeader超時狀態(tài)說明
IdleStateEvent
-IdleState
- IdleState.READER_IDLE 讀超時事件類型
- IdleState.WRITER_IDLE 寫超時事件類型
- IdleState.ALL_IDL 讀或者超時事件超時類型
超時異常處理方法 userEventTriggered
public void userEventTriggered( ChannelHandlerContext ctx, Object evt)
evt 此時的類型為 IdleStateEvent,可通過getState()判斷異常類型