【问题标题】:Placing timeout for SSLSocket handshake为 SSLSocket 握手设置超时
【发布时间】:2018-09-01 15:07:21
【问题描述】:

最近,我在使用 Apache 轴 1.4 的 SOAP 调用时遇到了问题。我已将超时设置为 30 秒,但有时会在抛出异常之前达到约 1000 秒。探索axis的内部实现,发现是SSLSocket握手的原因。

请参阅下面的示例错误。

java.net.SocketException: Connection timed out (Read failed)
at java.net.SocketInputStream.$$YJP$$socketRead0(Native Method)
at java.net.SocketInputStream.socketRead0(SocketInputStream.java)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)

是否可以在握手时也设置超时?或者有没有其他方法可以强行断开连接。

另外,查看代码中的握手部分

 sslSocket = sslFactory.createSocket(tunnel, host, port, true);
            if (log.isDebugEnabled()) {
                log.debug(Messages.getMessage("setupTunnel00",
                          tcp.getProxyHost(),
                        "" + tunnelPort));
            }
        }

        ((SSLSocket) sslSocket).startHandshake();

【问题讨论】:

    标签: java sockets ssl soap tcp


    【解决方案1】:

    当您创建tunnel 时,调用:

    tunnel.connect(new InetSocketAddress(host, port), 30000);
    

    【讨论】:

    • @CesarLoachamin 这不是审查的目的。如果您认为内容不正确,请对答案投反对票。据我所知,这不是 "critique" 的例子
    • @Eldon Hipolito 我还没有看到你在哪里设置超时。 tunnel的超时时间你设置了吗?
    • 老实说,apache轴设置了ssl套接字握手后的超时时间。
    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 2018-06-29
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多