得到这种奇怪的行为并且不知道 SO_LINGER(0)是否是解决问题的“最佳方法”。
只有当我同时拥有这两个因素时,这种情况才会发生:
当这两个因素结合在一起时,我的tcp连接(客户端)在调用close()之后立即卡在 FIN_WAIT 和 TIME_WAIT 时间
(在此网络中,在其他操作系统上运行的完全相同的应用程序的行为符合预期。适用于Windows,但网络连接更好)
在这种特殊情况下,我只是为fin_wait _(1或2)状态而烦恼。我的第一个想法是将so_linger设置为0,但我并不完全相信,在这里,异常终止关闭是正确的(或唯一的)选择。
关于如何处理此问题的任何想法?还有其他方法可以强制窗口以编程方式关闭该连接吗?
(编辑)
EventLoopGroup group = new NioEventLoopGroup(); try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
// .option(ChannelOption.SO_LINGER, 0) ( ?? )
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new MyHandler());
p.addLast(new WriteTimeoutHandler(8, TimeUnit.SECONDS));
ch.config()
.setSendBufferSize(TCP_BUF_SIZE)
.setReceiveBufferSize(TCP_BUF_SIZE);
}
});
ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
channelFuture.channel().closeFuture().sync();
} finally {
group.shutdownGracefully(); }