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

一、服务器启动示例:

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());
    }
}

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

时间: 2024-08-01 11:51:02

netty服务端实现心跳超时的主动拆链的相关文章

Netty服务端启动

Netty服务端启动过程 (1)创建服务端Channel:调用JDK底层的API创建一个JDK的Channel,然后netty将其包装成自己的Channel,同时创建一些基本组件绑定在此Channel上 (2)初始化服务端Channel:初始化一些基本属性,以及添加一些逻辑处理器 (3)注册selector:Netty将JDK底层的Channel注册到事件轮询器selector上面 (4)端口绑定:最终也是调用底层JDK的API实现对本地端口的监听 bind()[用户代码入口] initAndR

Netty 服务端启动过程

在 Netty 中创建 1 个 NioServerSocketChannel 在指定的端口监听客户端连接,这个过程主要有以下  个步骤: 创建 NioServerSocketChannel 初始化并注册 NioServerSocketChannel 绑定指定端口 首先列出一个简易服务端的启动代码: 1 public void start() { 2 EventLoopGroup bossGroup = new NioEventLoopGroup(1); 3 EventLoopGroup work

netty服务端启动--ServerBootstrap源码解析

netty服务端启动--ServerBootstrap源码解析 前面的第一篇文章中,我以spark中的netty客户端的创建为切入点,分析了netty的客户端引导类Bootstrap的参数设置以及启动过程.显然,我们还有另一个重要的部分--服务端的初始化和启动过程没有探究,所以这一节,我们就来从源码层面详细分析一下netty的服务端引导类ServerBootstrap的启动过程. spark中netty服务端的创建 我们仍然以spark中对netty的使用为例,以此为源码分析的切入点,首先我们看

Netty服务端(源码一)

首先,整理NIO进行服务端开发的步骤: (1)创建ServerSocketChannel,配置它为非阻塞模式. (2)绑定监听,配置TCP参数,backlog的大小. (3)创建一个独立的I/O线程,用于轮询多路复用器Selector. (4)创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKeyACCEPT. (5)启动I/O线程,在循环体中执行Selector.select()方法,轮训就绪的Channel. (6)当轮

Netty系列之Netty 服务端创建

1. 背景 1.1. 原生NIO类库的复杂性 在开始本文之前,我先讲一件自己亲身经历的事:大约在2011年的时候,周边的两个业务团队同时进行新版本开发,他们都需要基于NIO非阻塞特性构建高性能.异步和高可靠性的底层通信框架. 当时两个项目组的设计师都咨询了我的意见,在了解了两个项目团队的NIO编程经验和现状之后,我建议他们都使用Netty构建业务通信框架.令人遗憾的是其中1个项目组并没有按照我的建议做,而是选择直接基于JDK的NIO类库构建自己的通信框架.在他们看来,构建业务层的NIO通信框架并

Netty服务端的业务流程分析

Netty的服务端怎么和java NIO联系起来的,一直很好奇这块内容,这里跟下代码,下篇文章看下Channel相关的知识. final ChannelFuture initAndRegister() { final Channel channel = channelFactory().newChannel(); // try { init(channel); } catch (Throwable t) { channel.unsafe().closeForcibly(); //立即关闭通道且不

【转】C# client 与java netty 服务端的简单通信,客户端采用Unity

http://blog.csdn.net/wilsonke/article/details/24721057 近日根据官方提供的通信例子自己写了一个关于Unity(C#)和后台通信的类,拿出来和大家分享一下. 具体请参考: 1.java服务端用的apach.mina框架搭建.java服务端请参考:http://blog.9tech.cn/?c=site&m=article&id=548 2.C#环境:.NET framework 2.0 3.C#帮组文档,及Socket注解:http://

故障排查:是什么 导致了客户端批量心跳超时掉线

心跳超时指的是:针对某个在线的客户端(TCP连接),服务端在指定的时间内,没有收到来自该客户端的任何消息,则认为该客户端已经掉线. 为什么需要心跳机制了?因为针对某些客户端掉线(可能是因为网络断开.或客户端程序退出),服务端不能立即感受到(有的可能需要过很长的时间才能感受到),所以,需要引入心跳机制,让服务端尽可能早地发现客户端已经不在线了.关于心跳机制,更详细的介绍可以参见这里. 如果发生了很多客户端批量心跳超时掉线的情况,就说明服务端在过去的某段时间内,从未收到来自这些客户端的任何心跳消息.

Netty实现服务端客户端长连接通讯及心跳检测

通过netty实现服务端与客户端的长连接通讯,及心跳检测.        基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断.         环境JDK1.8 和netty5