【问题标题】:How to close ServerSocket connection when catching IOException?捕获 IOException 时如何关闭 ServerSocket 连接?
【发布时间】:2011-11-03 20:10:50
【问题描述】:

抱歉,我对 Java 完全不熟悉。从ServerSocket 捕获IOException 时执行ServerSocket.close() 的最佳实践是什么?根据文档,ServerSocket.close() 抛出 IOException 并且编译器要求我们捕捉它。在IOException 上关闭连接的正确方法是什么?

try {
    server = new ServerSocket(this.getServerPort());
    while(true) {
        socket = server.accept();
        new Handler( socket );
    }
} catch (IOException e) {
    if (server != null && !server.isClosed()) {
        server.close(); //compiler do not allow me to do because I should catch IOExceoption from this method also...
    }
}

谢谢!

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    这在 Java 中很丑陋。我讨厌它,但这是你应该这样做的方式:将它包装到另一个 try-catch 中:

    try {
        server = new ServerSocket(this.getServerPort());
        while(true) {
            socket = server.accept();
            new Handler( socket );
        }
    } catch (IOException e) {
        if (server != null && !server.isClosed()) {
            try {
                server.close();
            } catch (IOException e)
            {
                e.printStackTrace(System.err);
            }
        }
    }
    

    【讨论】:

    • 真的糟透了!感谢您的回答,它非常有用!
    • 注意,Java 7 中资源的新尝试。
    • 谢谢,我已经seen了。看起来很糟糕。
    【解决方案2】:

    如果您要在 try{}catch{} 之外关闭 ServerSocket,不妨将其放入 finally{}

    try {
        server = new ServerSocket(this.getServerPort());
        while(true) {
            socket = server.accept();
            new Handler( socket );
        }
    } catch (IOException e) {
        // Do whatever you need to do here, like maybe deal with "socket"?
    }
    finally {
        try {  
            server.close();
        } catch(Exception e) {
            // If you really want to know why you can't close the ServerSocket, like whether it's null or not
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 Java SE 7 或更高版本中,您可以使用 try-with-resources statementServerSocket implements java.io.Closeable,因此在使用这种方式时,您不需要显式地 #close() 套接字。

      try (ServerSocket server = new ServerSocket(this.getServerPort())) {
          while(true) {
              socket = server.accept();
              new Handler( socket );
          }
      } catch (IOException e) {
          // It's already closed, just print the exception
          System.out.println(e);
      }
      

      【讨论】:

        【解决方案4】:

        你可以关闭finally块中的资源,

        http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html

         } finally {
              try {
                socket.close();
              } catch(IOException e) {
                 e.printStackTrace(); 
              }
        }
        

        【讨论】:

        • 是的,这是真的。但它仍然无法编译,因为它可能会抛出 IOException。
        • 这没有意义。编译器还会要求从ServerSocket.close() 捕获IOException
        • 是的,你仍然应该用 try catch 来包装它。
        猜你喜欢
        • 2018-04-07
        • 1970-01-01
        • 2012-09-18
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        相关资源
        最近更新 更多