在学习 netty 建立 tcp 通讯连接时,不同情况下收集了多个关闭 channel 的方法

#1
ctx.writeAndFlush("timeout").addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
#2
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
#3
ctx.channel().close();
#4
ctx.close();

#1#2 方法基本相同,都是先往 channel 中写入数据并刷新缓冲区,只有后续添加的处理事件不一样。

ChannelFutureListener 常量值说明

来源:ChannelFutureListener (Netty 4.1.72.Final API文档 - 即时通讯网(52im.net))

#1 监听 ChannelFuture ,当操作失败或者不成功的作废发生时,关闭未来 channel。

#2 监听 ChannelFuture 并关闭未来 channel。

#3 关闭当前 channel,#4 关闭当前的容器,测试发现主程序并没有受到影响,所以应该是只针对 ChannelHandlerContext。关闭了当前的 channel 所在容器,自然 channel 也会被关闭。

测试发现 #1 并没有像想象中那样使用条件,而是直接关闭连接了。使用 Unpooled.EMPTY_BUFFER 替换字符串参数是可以,或者是 byte[] 类型也可以,但直接使用字符串是不行的,需要转化为对象。