一、服务器启动示例:

  1. public class MySocketServer {
  2. protected static Logger logger = LoggerFactory.getLogger(MySocketServer.class);
  3.  
  4. public void start(int port) {
  5. EventLoopGroup bossGroup = new NioEventLoopGroup(1);
  6. EventLoopGroup workerGroup = new NioEventLoopGroup();
  7. try {
  8. ServerBootstrap b = new ServerBootstrap();
  9. b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
  10. .childHandler(new SocketServerInitializer());
  11.  
  12. logger.debug("server side socket start successful on port {}", port);
  13.  
  14. b.bind(port).sync().channel().closeFuture().sync();
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. logger.error("{}", e.getMessage());
  18. } finally {
  19. bossGroup.shutdownGracefully();
  20. workerGroup.shutdownGracefully();
  21. }
  22. }
  23. }

二、各种业务Handler:

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

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

  1. public class IdleStateTrigger extends ChannelInboundHandlerAdapter {
  2. protected static Logger logger = LoggerFactory.getLogger(IdleStateTrigger.class);
  3.  
  4. @Override
  5. public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
  6. if (evt instanceof IdleStateEvent) {
  7. IdleState state = ((IdleStateEvent) evt).state();
  8. logger.debug("state is {}", state.name());
  9. if (state == IdleState.READER_IDLE) {
  10. ctx.close(); // 如果是超过10s没有读到数据,关闭客户端连接
  11. throw new Exception("idle exception");
  12. }
  13. } else {
  14. super.userEventTriggered(ctx, evt);
  15. }
  16. }
  17.  
  18. }

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

  1. public class SocketServerInitializer extends ChannelInitializer<SocketChannel> {
  2. @Override
  3. protected void initChannel(SocketChannel ch) throws Exception {
  4. ch.pipeline()
  5. .addLast(new StringDecoder())
  6. .addLast(new StringEncoder())
  7. .addLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS))
  8. .addLast(new ServerHandler());
  9. }
  10. }

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

  1. netty5服务端检测心跳超时断连

    客户端每5秒发送一次心跳给服务端,服务端记录最后一次心跳时间,通过定时任务每10秒检测一下,如果当前时间与最后一次收到的心跳时间之差超过某个阈值,断开与客户端的连接.基于之前的例子(netty5心跳与 ...

  2. Netty 服务端创建

    参考:http://blog.csdn.net/suifeng3051/article/details/28861883?utm_source=tuicool&utm_medium=refer ...

  3. 【Netty源码分析】Netty服务端bind端口过程

    这一篇博客我们介绍一下Netty服务端绑定端口的过程,我们通过跟踪代码一直到NIO原生绑定端口的操作. 绑定端口操作 ChannelFuture future = serverBootstrap.bi ...

  4. Netty 服务端启动过程

    在 Netty 中创建 1 个 NioServerSocketChannel 在指定的端口监听客户端连接,这个过程主要有以下  个步骤: 创建 NioServerSocketChannel 初始化并注 ...

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

    netty服务端启动--ServerBootstrap源码解析 前面的第一篇文章中,我以spark中的netty客户端的创建为切入点,分析了netty的客户端引导类Bootstrap的参数设置以及启动 ...

  6. Netty服务端NioEventLoop启动及新连接接入处理

    一 Netty服务端NioEventLoop的启动 Netty服务端创建.初始化完成后,再向Selector上注册时,会将服务端Channel与NioEventLoop绑定,绑定之后,一方面会将服务端 ...

  7. Netty服务端Channel的创建与初始化

    Netty创建服务端Channel时,从服务端 ServerBootstrap 类的 bind 方法进入,下图是创建服务端Channel的函数调用链.在后续代码中通过反射的方式创建服务端Channel ...

  8. Netty服务端的启动源码分析

    ServerBootstrap的构造: public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, Serve ...

  9. Netty之旅三:Netty服务端启动源码分析,一梭子带走!

    Netty服务端启动流程源码分析 前记 哈喽,自从上篇<Netty之旅二:口口相传的高性能Netty到底是什么?>后,迟迟两周才开启今天的Netty源码系列.源码分析的第一篇文章,下一篇我 ...

随机推荐

  1. SpringBoot 启动错误搜集

    Spring Boot:The Bean Validation API is on the classpath but no implementation could be found https:/ ...

  2. .net 关于匿名类型的特性

    匿名类型 1: var n1 = new { name = "name1", age = 40 }; 2: var n2 = new { name = "name2&qu ...

  3. 百度搜索URL参数

    http://www.baidu.com/s?wd=关键字wd(Keyword):查询的关键词:http://www.baidu.com/s?wd=关键字&cl=3cl(Class):搜索类型 ...

  4. pynput使用简单说明

    控制鼠标 from pynput.mouse import Button, Controller import time mouse = Controller() print(mouse.positi ...

  5. 前台登录和Token信息交互流程

    原来总是对前台登录,怎么利用token有点迷惑,后面仔细的想了一遍,把自己简单的想法记录下来,留作记录,以便后续优化 各路大神有什么看法也可以说,能更完善整个流程. 不说了,暴力的上图: 该图是出自c ...

  6. 通过淘宝接口免费获取IP地址信息

    1.获取互联网访问IP信息 一般获取互联网访问的IP的相关信息一般都是收费接口,免费的接口不多,我使用到一个接口如下: http://ip.taobao.com/service/getIpInfo.p ...

  7. 演示一下:rm -rf /

  8. Maven 拾遗

    01. maven 概要 首先我把 maven 的概念快速的梳理一下,让我们快速地建立起一个比较精确的 maven 应用场景. maven 不是 ant,也不是 make,以前接触的构建工具,需要写一 ...

  9. 《Unix&Linux大学教程》学习笔记一:历史与常识

     “为什么说Unix/Linux是自由的:         因为我们可以自己组装一个操作系统:Unix/Linux内核+其他实用工具+编程工具+GUI         因为我们可以自由地获取开源工作者 ...

  10. SQL Server 默认跟踪(Default Trace)获取某个Trace跟踪了哪些Event和column

    检查Default Trace是否已经开启,如果返回Figure1中value为1,那就说明已经开启默认跟踪了:如果value为0表示关闭默认跟踪: --查询Default Trace是否开启 ; 如 ...