我正在使用 Netty 版本 2.6.0.Final。
如果我正确理解 Netty 文档,在 Channel 上调用 disconnect() 应该允许我稍后调用 connect() 再次连接。但是,当我调用 disconnect() 时,我的 SimpleChannelHandler 子类的 channelDisconnected() 和 channelClosed() 都会被调用。
我在调试模式下打开它,基本上事件的顺序是:
- 我在我的频道上调用 disconnect()
Channels.disconnect() 被调用:
public static ChannelFuture disconnect(Channel channel) { ChannelFuture future = future(channel); channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent( channel, future, ChannelState.CONNECTED, null)); return future; }
最终,NioSocketPipelineSink.eventSunk() 被调用,相关部分是:
case CONNECTED: if (value != null) { connect(channel, future, (SocketAddress) value); } else { channel.worker.close(channel, future); } break;
因此,由于值为 null 并且状态为 CONNECTED,因此通道将关闭(尽管根据此处CONNECTED 与 null 应该表示断开连接的请求,不一定关闭。
那么我在这里错过了什么吗?如果 disconnect() 只是导致通道被关闭,那么它有什么意义呢?
这不是一个大问题,因为如果我需要,我可以为我的情况创建一个新通道,但从最初的检查来看,这似乎是一个 Netty 错误,除非我只是误解了它应该如何工作或者我'我在做一些傻事。