为SSLSocket握手设置超时

时间:2018-03-23 01:49:05

标签: java sockets ssl soap tcp

最近,我遇到了使用apache axis 1.4的SOAP调用问题。我已将超时设置为30秒,但有时会在抛出异常之前达到约1000秒。在探索了轴的内部实现之后,我发现它是由于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();

1 个答案:

答案 0 :(得分:0)

创建tunnel时,请致电tunnel.connect(new InetSocketAddress(host, port), 30000);