1. 程式人生 > 其它 >Netty心跳保活demo

Netty心跳保活demo

技術標籤:netty

  • Netty心跳保活
    客戶端定時傳送訊息到服務端,超過指定時間,計為1次超時,達到指定次數,服務端傳送關閉訊息到客戶端。客戶端自動下線。

服務端新增IdleStateHandler到pipeline

//IdleStateHandler的readerIdleTime引數指定超過3秒還沒收到客戶端的連線,
//會觸發IdleStateEvent事件並且交給下一個handler處理,下一個handler必須
//實現userEventTriggered方法處理對應事件
pipeline.addLast(new IdleStateHandler(3, 0, 0, TimeUnit.SECONDS)
); pipeline.addLast(new HeartBeatServerHandler());

實現userEventTriggered

	int readIdleTimes = 0;
	
	@Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        IdleStateEvent event = (IdleStateEvent) evt;

        String eventType = null;
        switch
(event.state()) { case READER_IDLE: eventType = "讀空閒"; readIdleTimes++; // 讀空閒的計數加1 break; case WRITER_IDLE: eventType = "寫空閒"; // 不處理 break; case ALL_IDLE:
eventType = "讀寫空閒"; // 不處理 break; } System.out.println(ctx.channel().remoteAddress() + "超時事件:" + eventType); if (readIdleTimes > 3) { System.out.println(" [server]讀空閒超過3次,關閉連線,釋放更多資源"); ctx.channel().writeAndFlush("idle close"); ctx.channel().close(); } }

客戶端判斷訊息是否需要下線

        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
            System.out.println(" client received :" + msg);
            if (null != msg && msg.equals("idle close")) {
                System.out.println(" 服務端關閉連線,客戶端也關閉");
                ctx.channel().closeFuture();
            }
        }

詳細程式碼:github