Java 如何让netty channel.writeAndFlush()在没有TCP ACK响应时引发异常

Java 如何让netty channel.writeAndFlush()在没有TCP ACK响应时引发异常,java,exception,netty,Java,Exception,Netty,我正在开发一个具有Netty4框架的IM服务器。同时,我使用名为channel.writeAndFlush()的方法向客户端发送消息。然而,当移动电话上的客户端的套接字异常关闭(例如关闭网络连接或打开设备上的飞行模式)时,netty4帧无法发现相应的信道处于非活动状态。此外,由writeAndFlush()方法返回的ChannelGroupFuture使用方法ChannelGroupFuture.issucess()报告发送结果成功。 那么,为什么ChannelGroupFuture没有返回我发

我正在开发一个具有Netty4框架的IM服务器。同时,我使用名为
channel.writeAndFlush()的方法向客户端发送消息。然而,当移动电话上的客户端的套接字异常关闭(例如关闭网络连接或打开设备上的飞行模式)时,netty4帧无法发现相应的信道处于非活动状态。此外,由
writeAndFlush()
方法返回的
ChannelGroupFuture
使用方法
ChannelGroupFuture.issucess()
报告发送结果成功。 那么,为什么
ChannelGroupFuture
没有返回我发送失败而没有抛出任何异常

ChannelGroupFuture future = connectionService.sendMessageToUser(msgBase, toUid).sync();

future.addListeners(new ChannelGroupFutureListener(){

@Override
                public void operationComplete(ChannelGroupFuture future)
                        throws Exception {
                    if(future.isDone() && future.isSuccess()){
                        chatMessageService.saveSentChatMessage(msgBase);
                    } else if(!future.isSuccess()){
                        chatMessageService.saveUnsentChatMessage(msgBase);
                    }
});

 public ChannelGroupFuture writeAndFlush(Object message, ChannelMatcher matcher) {
    if (message == null) {
        throw new NullPointerException("message");
    }
    if (matcher == null) {
        throw new NullPointerException("matcher");
    }
    if(matcher instanceof AttributeChannelMatcher){
        Map<Channel, ChannelFuture> futures = new LinkedHashMap<Channel, ChannelFuture>(1);
        AttributeChannelMatcher<T>  attributeMatcher = (AttributeChannelMatcher<T>) matcher;
        Channel c = nonServerChannelMap.get(attributeMatcher.getAttributeKeyValue());

        futures.put(c, c.writeAndFlush(safeDuplicate(message)));
        ReferenceCountUtil.release(message);
        return new DefaultChannelGroupFuture(this, futures, executor);
    }else{
        Map<Channel, ChannelFuture> futures = new LinkedHashMap<Channel, ChannelFuture>(size());

        for (Channel c :  nonServerChannelMap.values()) {
            if (matcher.matches(c)) {
                futures.put(c, c.writeAndFlush(safeDuplicate(message)));
            }
        }
        ReferenceCountUtil.release(message);
        return new DefaultChannelGroupFuture(this, futures, executor);
    }
}
ChannelGroupFuture=connectionService.sendMessageToUser(msgBase,toUid.sync();
future.addListeners(新ChannelGroupFutureListener(){
@凌驾
公共无效操作完成(ChannelGroupFuture)
抛出异常{
if(future.isDone()&&future.issucess()){
saveSentChatMessage(msgBase);
}如果(!future.issucess()),则为else{
saveUnsentChatMessage(msgBase);
}
});
public ChannelGroupFuture writeAndFlush(对象消息、通道匹配器匹配器){
如果(消息==null){
抛出新的NullPointerException(“消息”);
}
if(matcher==null){
抛出新的NullPointerException(“匹配器”);
}
if(属性通道匹配器的匹配器实例){
地图期货=新LinkedHashMap(1);
AttributeChannelMatcher attributeMatcher=(AttributeChannelMatcher)匹配器;
通道c=nonServerChannelMap.get(attributeMatcher.getAttributeKeyValue());
期货。看跌期权(c,c。写交易(安全复制(信息));
ReferenceCountUtil.release(消息);
返回新的DefaultChannelGroupFuture(本、期货、执行人);
}否则{
Map futures=newlinkedhashmap(size());
对于(通道c:nonServerChannelMap.values()){
if(匹配器匹配(c)){
期货。看跌期权(c,c。写交易(安全复制(信息));
}
}
ReferenceCountUtil.release(消息);
返回新的DefaultChannelGroupFuture(本、期货、执行人);
}
}

您不能。TCP写入对于应用程序来说是异步的。它们不会等待确认后再返回。发送端有一个发送缓冲区,接收端有一个接收缓冲区。所有这些都意味着可能需要几次写入和几秒钟才能检测到断开的连接