我有以下情况:
以这种方式打开一个新的通道连接:
ClientBootstrap bootstrap = new ClientBootstrap(
new OioClientSocketChannelFactory(Executors.newCachedThreadPool()));
icapClientChannelPipeline = new ICAPClientChannelPipeline();
bootstrap.setPipelineFactory(icapClientChannelPipeline);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
channel = future.awaitUninterruptibly().getChannel();
这按预期工作。
内容通过以下方式写入通道:
channel.write(chunk)
当与服务器的连接仍然存在时,这也可以按预期工作。但是如果服务器宕机(机器离线),呼叫就会挂起并且不会返回。
我通过在channel.write(chunk)
. 当连接断开时,只显示之前的日志语句。
这是什么原因造成的?我认为这些调用都是异步的并立即返回?我也试过 NioClientSocketChannelFactory,同样的行为。
我尝试使用
channel.getCloseFuture()
但从未调用过侦听器,我尝试在使用之前检查频道channel.isOpen()
,channel.isConnected()
并且channel.isWritable()
它们总是正确的......如何解决这个问题?没有抛出异常,也没有真正发生任何事情......像this和this这样的一些问题表明,如果没有心跳,就无法检测到通道断开连接。但是我无法实现心跳,因为我无法更改服务器端。
环境:Netty 3、JDK 1.7