首页 > 解决方案 > createSocket() 很长一段时间后返回

问题描述

我的代码假设与一些对等方启动 SSL 套接字,提取证书并关闭套接字。

问题是,createSocket()似乎阻塞了很长时间。如何设置合理的超时时间?

这是我的完整代码:

public static void main(String[] args) throws Exception {

        SSLContext sslCtx;
        sslCtx = SSLContext.getInstance("TLSv1.2");

        sslCtx.init(null, new TrustManager[]{new X509TrustManager() {

            private X509Certificate[] accepted;

            @Override
            public void checkClientTrusted(X509Certificate[] xcs, String string) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] xcs, String string) {
                accepted = xcs;
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return accepted;
            }
        }}, null);


        System.out.println("start ....");
        try (SSLSocket sslSocket = (SSLSocket) sslCtx.getSocketFactory().createSocket("156.70.54.68", 443)) {
            sslSocket.setSoTimeout(5_000);
            Certificate[] certificates = sslSocket.getSession().getPeerCertificates();
            System.out.println(certificates.length);
        } catch (Exception e) {
            System.out.println(e);
        }
    }

标签: javassl

解决方案


而不是调用 socket(String, int) 调用 socket() ,然后定义超时,然后调用 connect(InetSocketAddress, int) ,它需要一个 int 来表示超时。

    try (SSLSocket sslSocket = (SSLSocket) sslCtx.getSocketFactory().createSocket()) {
        sslSocket.setSoTimeout(5_000);
        Certificate[] certificates = sslSocket.getSession().getPeerCertificates();
        System.out.println(certificates.length);
        sslSocket.connect(new InetSocketAddress("156.70.54.68", 443), 5_000);
    } catch (Exception e) {
        System.out.println(e);
    }

推荐阅读