说明
io.netty.channel.ChannelHandler有两个生命周期监听事件方法:
-
handlerAdded(ChannelHandlerContext ctx):当ChannelHandler被添加到实际的上下文、并且已经准备就绪等待处理事件的时候被调用。
-
handlerRemoved(ChannelHandlerContext ctx):当ChannelHandler从实际的上下文被移除、并且不能再处理事件的时候被调用。
示例
服务端代码片段
package com.thb.power.server;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
/**
* 服务端的主函数
* @author thb
*
*/
public class MainStation {
static final int PORT = Integer.parseInt(System.getProperty("port", "22335"));
public static void main(String[] args) throws Exception {
// 配置服务器
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new MainStationInitializer());
// 启动服务端
ChannelFuture f = b.bind(PORT).sync();
// 等待直到server socket关闭
f.channel().closeFuture().sync();
} finally {
// 关闭所有event loops以便终止所有的线程
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
package com.thb.power.server;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
public class MainStationInitializer extends ChannelInitializer<SocketChannel> {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(new ServerHandler());
}
}
package com.thb.power.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class ServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void handlerAdded(ChannelHandlerContext ctx) {
System.out.println(ctx.handler() + " added");
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) {
System.out.println(ctx.handler() + " removed");
}
}
启动服务端(客户端还没有启动)
从上面输出可以看出,因为服务端的ServerHandler是通过MainStationInitializer增加到ServerBootstrap的childHandler中,此时客户端还没有启动,所以也就没有连接到服务端,所以ServerHandler还没有增加进来。
启动客户端、并且观察服务端的输出
启动客户端,客户端有如下输出,可以看到,连接到了服务端:
此时到服务端的窗口,可以看到,又增加了如下输出:
从上面服务端增加的输出可以看出,服务端的ServerHandler被增加进来了。
用Ctrl c终止客户端、并且观察服务端的输出
用Ctrl c终止客户端,客户端增加如下输出:
此时到服务端的窗口,可以看到服务端增加如下输出:
从服务端增加的输出可以发现,服务端的ServerHandler被移除。