【问题标题】:How do I check if a SSLSocket connection is sane on Java?如何检查 Java 上的 SSLSocket 连接是否正常?
【发布时间】:2010-08-25 16:42:51
【问题描述】:

我有一个 SSLSocket 池,我需要在借用对象之前检查套接字连接是否正常。

isConnected、isInputShutdown 和 isOutputShutdown 没有用,因为它们不检查双方是否已连接,如果我尝试从套接字写入或读取,我可能会收到 SocketException。

这是我测试连接的代码:

if(sslSocket.isConnected() && 
       !sslSocket.isInputShutdown() && 
       !sslSocket.isOutputShutdown()){
    valid = true;
}

如上所述,此代码不起作用。

那么,检查 SSLSocket(或常规 Socket)是否正常的最佳方法是什么?

【问题讨论】:

    标签: java sockets ssl


    【解决方案1】:

    如果“正常”是指已连接,则只有在尝试写入 TCP 套接字后才能检测到它已断开连接:

    http://lkml.indiana.edu/hypermail/linux/kernel/0106.1/1154.html

    因此,您需要在 Java 中相应地利用异常。

    【讨论】:

    • 我已经测试过通过连接发送一个字节并捕获异常,但这似乎并没有测试读取操作,我可以在稍后读取时遇到异常。我可能在这方面错了,会做更多的测试。
    • 同样的事情,你不能测试你是否可以阅读,直到你阅读。在您测试套接字是否打开到您从中读取的时间之间,远程方可能已经关闭了连接。它甚至可以在您阅读时将其关闭。
    • 请记住,套接字的状态部分由对等方控制。因此,您在本地计算机上执行的任何检查几乎都会立即变得陈旧。
    【解决方案2】:

    尝试从套接字读取并捕获 SocketException 是否不够理智?

    【讨论】:

    • 如果套接字上没有任何内容,我无法从套接字读取,那将是阻塞的。使用 inputStream 中的 available() 方法检查套接字上是否有可用的东西也是不够的。
    • available() 对于 SSLSocket 总是返回零,但是有超时机制,看我的回答。
    【解决方案3】:

    如果读取,通过 Socket.setSoTimeout() 设置 readTimeout 并捕获 SocketTimeoutException,或者写入并捕获 IOException:连接重置。没有其他机制。您提到的 isXXX() API 仅告诉您 此 Socket 做了什么。 它们不会告诉您任何有关 连接状态的信息。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,解决方法如下:由于 sslSocket 是从 sslServerSocket 创建的,因此关闭服务器套接字而不是套接字将起作用。

      使用建议的超时、捕获 SSLException 并关闭套接字应该有助于确保连接仍然有效,无需线程。

      sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(sslServerSocketPort);
      sslsocket = (SSLSocket) sslserversocket.accept();
      sslsocket.setSoTimeout(5000);
      
      // Restart connections
      if(sslserversocket.isClosed() || sslserversocket == null){
          sslserversocket.close();
          startSSLServer();
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-10
        • 2017-03-04
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 2022-10-25
        • 1970-01-01
        相关资源
        最近更新 更多