分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

netty服务端实现心跳超时的主动拆链

发布时间:2023-09-06 01:39责任编辑:苏小强关键词:暂无标签

一、服务器启动示例:

public class MySocketServer { ???protected static Logger logger = LoggerFactory.getLogger(MySocketServer.class); ???public void start(int port) { ???????EventLoopGroup bossGroup = new NioEventLoopGroup(1); ???????EventLoopGroup workerGroup = new NioEventLoopGroup(); ???????try { ???????????ServerBootstrap b = new ServerBootstrap(); ???????????b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) ???????????????????.childHandler(new SocketServerInitializer()); ???????????logger.debug("server side socket start successful on port {}", port); ???????????b.bind(port).sync().channel().closeFuture().sync(); ???????} catch (InterruptedException e) { ???????????e.printStackTrace(); ???????????logger.error("{}", e.getMessage()); ???????} finally { ???????????bossGroup.shutdownGracefully(); ???????????workerGroup.shutdownGracefully(); ???????} ???}}

二、各种业务Handler:

public class SocketServerInitializer extends ChannelInitializer<SocketChannel> { ???@Override ???protected void initChannel(SocketChannel ch) throws Exception { ???????ch.pipeline() ???????????.addLast(new IdleStateHandler(10, 0, 0, TimeUnit.SECONDS)) // 构造一个超时event消息 ???????????.addLast(new IdleStateTrigger()) // 处理超时event消息 ???????????.addLast(new StringDecoder()) ???????????.addLast(new StringEncoder()) ???????????.addLast(new ServerHandler()); ???}}

三、读空闲(超过10s)的事件处理

public class IdleStateTrigger extends ChannelInboundHandlerAdapter { ???protected static Logger logger = LoggerFactory.getLogger(IdleStateTrigger.class); ???@Override ???public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { ???????if (evt instanceof IdleStateEvent) { ???????????IdleState state = ((IdleStateEvent) evt).state(); ???????????logger.debug("state is {}", state.name()); ???????????if (state == IdleState.READER_IDLE) { ???????????????ctx.close(); // 如果是超过10s没有读到数据,关闭客户端连接 ???????????????throw new Exception("idle exception"); ???????????} ???????} else { ???????????super.userEventTriggered(ctx, evt); ???????} ???}}

附录、超时功能的快捷实现
使用自带的ReadTimeoutHandler

public class SocketServerInitializer extends ChannelInitializer<SocketChannel> { ???@Override ???protected void initChannel(SocketChannel ch) throws Exception { ????????ch.pipeline() ???????.addLast(new StringDecoder()) ???????.addLast(new StringEncoder()) ???????.addLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS)) ???????.addLast(new ServerHandler()); ???}}

netty服务端实现心跳超时的主动拆链

原文地址:https://www.cnblogs.com/yoyotl/p/7514836.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved