Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SocketChannel:java.io.IOException:远程主机强制关闭了现有连接_Java_Sockets_Exception Handling_Nio - Fatal编程技术网

SocketChannel:java.io.IOException:远程主机强制关闭了现有连接

SocketChannel:java.io.IOException:远程主机强制关闭了现有连接,java,sockets,exception-handling,nio,Java,Sockets,Exception Handling,Nio,我正在使用带有网络套接字的SocketChannel,并且必须处理套接字另一端意外关闭通道的预期异常 问题是,我得到了这个IOException: 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.re

我正在使用带有网络套接字的SocketChannel,并且必须处理套接字另一端意外关闭通道的预期异常

问题是,我得到了这个IOException:

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(Unknown Source)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
    at sun.nio.ch.IOUtil.read(Unknown Source)
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
    ...
我需要区分预期会发生的此异常和意外异常,以便记录/打印意外异常并处理此异常。但这只是一个普通的IOException,带有不同的文本消息,尽管我总是检查SocketChannel.isOpen()和SocketChannel.isConnected(),但在这种情况下,即使套接字的另一端已关闭,它们似乎也返回true


我能/应该做什么?

这可能有点难看。。。你可以玩接球游戏。双击代码,捕获第一个异常并确定消息。如果这是你期望的,忽略它,或者做你以前打算做的事情。如果它不是你所期望的,那就去尝试更高的层次

现在我想了想,如果你愿意的话,你可以一次尝试一下,只要看看信息就可以了

也就是说,我认为您应该重新评估依赖此异常来控制程序流的想法。你确定你应该有一个设计,上面写着“我希望这个例外发生”

isOpen()和isConnected()应该更准确地称为hasbeennopened()和hasbeennconnected()。一旦它们是真的,它们就不会回到假

您可能需要执行e.getMessage().contains(“由远程主机关闭”)。不幸的是,这可能依赖于平台


相反,我建议您允许协议发送某种类型的“已关闭”消息,并将任何异常视为意外情况。

等等,这会发生吗?比如,你真的想让它发生吗?我不想让它发生,但它一直都在发生:插座的另一端会在它感觉到的时候关闭它。我没有带内机制说“好的,再见!”所以服务器知道何时停止通信,所以我只需要处理。网络可能会崩溃,不管怎样。我想把这种情况当作正常情况。是的,我想过解析消息字符串——它很难看,我不应该这么做,但听起来我没有其他选择。是的,我必须承认——我根本不喜欢这段代码。我试着以“如果发生异常,就有错误”的心态来操作。不过,我理解你的情况。有时候我们就是没有时间/资金/政治来按照我们想要的方式做事-(我不知道为什么Sun没有抛出ClosedChannel异常。如果必须这样做,我将使用您的方法,否则Peter认为最好发送某种关闭的消息;我会找到一种方法。argh@EJP:(OP=me)--那么他们应该定义ConnectionClosedException或其他什么。
try {
    try {
       // your code
    } catch(IOException innerIOE) {
        if(innerIOE.getMessage().begins("An existing connection was forcibly closed")) {
            log.info("Exception expected, yay.");
        }
        else {
            throw innerIOE;
        }
    } // end inner catch
} catch(IOException outerIOE) {
    // error handling code here, your "An existing connection was forcibly closed"
    // shouldn't make it out here
}