java - 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);
}
}
解决方案
而不是调用 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);
}
推荐阅读
- javascript - 移动响应式导航栏
- json - Docusign API 使用模板和模板中的自定义字段未通过 HttpRequest 填充
- python-3.x - 如何使用 eric6 运行程序
- html - 表格行高不会改变
- swift - 如何限制 Swift UI 中从 fetch 请求返回的实体数量?
- python - 使用 ElementTree 从我的 xsd 文件中获取价值
- c# - Asp Net Core 如何使用ajax 渲染剃须刀组件?
- javascript - 如何在javascript函数中重置一个值
- javascript - 成功更新提供者后,React 上下文不会将更改传播给其他消费者
- javascript - 单击页面上的另一个按钮时如何打开导航/选项卡?