0

我正在测试连接失败期间的客户端服务器处理。

在客户端,当我从客户端向服务器发送消息时拔下 LAN 电缆时,我的 ChannelFuture(如下)没有被调用。我所期望的是异常会被我的 ChannelFuture 捕获,因此我可以在 operationComplete 中处理它。

相反,它只会被客户端管道中的最后一个上游处理程序捕获。难道我做错了什么?或者这可能是 Netty 3.2.4 的问题?

当我拔下 LAN 电缆时,我在处理程序中遇到的异常:

    java.io.IOException: An existing connection was forcibly closed by the remote host
        at sun.nio.ch.SocketDispatcher.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:198)
        at sun.nio.ch.IOUtil.read(IOUtil.java:166)
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:321)
        at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:280)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:200)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

我的频道未来:

    ChannelFuture future = Channels.write(channel, message);
    future.addListener(new ChannelFutureListener() {

           @Override
           public void operationComplete(ChannelFuture future) throws Exception {
               if (!future.isSuccess()) {
                   LOG.error("Client failed to send message", future.getCause());
                   future.getChannel().close();
               }
           }
    });
4

1 回答 1

0

从堆栈看来,写入已成功完成。尝试从通道读取时抛出异常。如果您对这种异常感兴趣,您将需要实现自己的 SimpleChannelUpstreamHandler 并覆盖 exceptionCaught(..) 方法。

请务必将处理程序添加到 ChannelPipeline。

于 2012-04-04T09:35:16.300 回答