【问题标题】:How to properly close a socket after an exception is caught?捕获异常后如何正确关闭套接字?
【发布时间】:2011-01-14 08:23:25
【问题描述】:

在我上一个项目之后,我遇到了客户端期望来自服务器的对象的问题,但是在处理客户端输入时,捕获了一个异常,该异常迫使服务器出于安全原因关闭套接字。

这会导致客户端以非常不愉快的方式终止,我决定处理此问题的方式是在每次收到输入后向客户端发送输入状态消息,以便他知道他的输入是否被正确处理或是否需要抛出异常。

所以我的问题:

  • 是否有更好/更清洁的方法在捕获异常后关闭套接字?

【问题讨论】:

    标签: java exception-handling sockets


    【解决方案1】:

    不正确。只有当您尝试使用 您自己关闭的套接字时,才会发生该异常。

    OP 应该寻找的是 EOFException,或 IOException: 'connection reset',或 SocketTimeoutException。

    【讨论】:

      【解决方案2】:

      如果我理解正确,您已经从服务器端关闭了套接字,您需要您的客户端意识到这一点并相应地处理错误。

      查看Socket 文档,尤其是setSoTimeout 方法。例如,如果超时设置为 5 秒并且客户端尝试从服务器套接字读取并且他没有得到应答,则超时到期并引发java.net.SocketTimeoutException,您可以捕获它并关闭套接字。

      您还可以使用ScheduledExecutorServiceTimer 来模拟超时。

      【讨论】:

        【解决方案3】:

        你真的不能,因为套接字是关闭的,你可以在客户端监听

        java.net.SocketException: socket closed 
        

        然后你就会知道你失去了与服务器的连接。

        【讨论】:

        • 不正确,看我的回答。你不能“监听”异常,而那个异常没有那个意义。
        【解决方案4】:

        对于这样的事情:

        1. 确保将此套接字代码放在 try/catch 块中。
        2. 在“finally”中关闭套接字。这样,无论是否有异常,您都可以确保干净地关闭套接字。

        【讨论】:

        • 感谢您的回答,我已经这样做了,问题是如何与客户沟通他的对象没有来?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多