转:http://blog.csdn.net/guanxinquan/article/details/10990337
网络连接中,处理Idle事件是很常见的,比如在mqtt服务中,客户端与服务端在指定时间内没有任何读写请求,就会认为连接是idle的,此时,客户端在指定的idle时间内没有向服务端发送ping消息,服务端可以断开与客户端的链接。
下面的代码演示了在netty中如何设置idle事件。
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelOption;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.channel.socket.nio.NioServerSocketChannel;
- import io.netty.handler.timeout.IdleState;
- import io.netty.handler.timeout.IdleStateEvent;
- import io.netty.handler.timeout.IdleStateHandler;
- public class NettyTest {
- public static void main(String[] args) throws InterruptedException {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- ServerBootstrap b = new ServerBootstrap();
- b.group(bossGroup, workerGroup)
- .channel(NioServerSocketChannel.class)
- .childHandler(new ChannelInitializer<SocketChannel>() {
- private static final int IDEL_TIME_OUT = 10;
- private static final int READ_IDEL_TIME_OUT = 4;
- private static final int WRITE_IDEL_TIME_OUT = 5;
- @Override
- public void initChannel(SocketChannel ch) throws Exception {
- ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(READ_IDEL_TIME_OUT, WRITE_IDEL_TIME_OUT, IDEL_TIME_OUT));
- ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
- @Override
- public void userEventTriggered(
- ChannelHandlerContext ctx, Object evt)
- throws Exception {
- if(IdleStateEvent.class.isAssignableFrom(evt.getClass())){
- IdleStateEvent event = (IdleStateEvent) evt;
- if(event.state() == IdleState.READER_IDLE)
- System.out.println("read idle");
- else if(event.state() == IdleState.WRITER_IDLE)
- System.out.println("write idle");
- else if(event.state() == IdleState.ALL_IDLE)
- System.out.println("all idle");
- }
- }
- });
- }
- })
- .option(ChannelOption.SO_BACKLOG, 128)
- .childOption(ChannelOption.SO_KEEPALIVE, true);
- ChannelFuture f = b.bind(8080).sync();
- f.channel().closeFuture().sync();
- } finally {
- workerGroup.shutdownGracefully();
- bossGroup.shutdownGracefully();
- }
- }
- }
首先添加了idleStateHandler用于监听链接idle,如果连接到达idle时间,这个handler会触发idleEvent,之后通过重写userEventTriggered方法,完成idle事件的处理。
相关推荐
Netty中文指南教程 详细描述netty的官方文档,中文版
Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty...
netty中文开发指南,netty是java基于事件的tcp/ip通信技术。
netty中的多线程并发应用,
netty 4.1 中文.CHM,开发netty的中文工具书 帮助文档,中文版netty
netty 4.1中文.CHM,chm格式,中文api,开发netty的中文工具书
Netty_中文技术文档,Netty操作指南
很多学习netty的小伙伴,感觉看原生态纯英文文档非常吃力,而且很多语义不懂,这使得学习变得枯燥乏味,这次分享的资源就可以完美解决这个问题,让你能够更方便快捷的学习并掌握这门技术
Netty应用中文详解
赠送jar包:netty-all-4.1.17.Final.jar; 赠送原API文档:netty-all-4.1.17.Final-javadoc.jar; 赠送源代码:netty-all-4.1.17.Final-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
Netty-API-文档中文版,学习Netty再也不怕看不懂英文了
Netty在Android开发中的应用实战系列(一)——— 搭建服务端与客户端:https://azhon.blog.csdn.net/article/details/100569489 Netty在Android开发中的应用实战系列(二)——— Encoder | Decoder | Handler 的...
netty-3.1官网学习手册,中文版
赠送jar包:netty-3.10.5.Final.jar; 赠送原API文档:netty-3.10.5.Final-javadoc.jar; 赠送源代码:netty-3.10.5.Final-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
netty3.1 中文用户手册; netty3.1 中文用户手册;
多线程并发编程在Netty中的应用分析
Java网络编程框架,学写使用Netty开发Socket服务
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码
一个netty的中文文档和demo。 。
Netty作为异步事件驱动的高性能基础通信框架,其应用越来越广泛,为了打破传统的http协议那种request—response一请求一响应的数据传输模式自身的限制,时下的bs架构应用不再浏满足于浏览器主动发起通信请求服务器...