在 Java 网络编程中,超时(Timeout)是一个常见问题,处理得好可以显著提升程序的健壮性和用户体验。下面从常见场景、设置方式、处理策略几个方面系统说明。
连接超时(Connect Timeout)
读取超时(Read Timeout)
写超时(Write Timeout)
java.net.SocketSocket socket = new Socket();
socket.setSoTimeout(5000); // 读取超时(毫秒)
socket.connect(
new InetSocketAddress("example.com", 80),
3000 // 连接超时(毫秒)
);
✅ 说明:
connect(...) 第二个参数:连接超时setSoTimeout():读取超时(影响 read())HttpURLConnectionHttpURLConnection conn =
(HttpURLConnection) new URL("http://example.com").openConnection();
conn.setConnectTimeout(3000); // 连接超时
conn.setReadTimeout(5000); // 读取超时
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(3000)
.setSocketTimeout(5000)
.setConnectionRequestTimeout(2000)
.build();
CloseableHttpClient client = HttpClients.custom()
.setDefaultRequestConfig(config)
.build();
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.build();
try {
// 网络操作
} catch (java.net.SocketTimeoutException e) {
// 超时处理
System.err.println("请求超时:" + e.getMessage());
} catch (IOException e) {
// 其他 IO 异常
}
int retry = 3;
while (retry-- > 0) {
try {
// 网络请求
break;
} catch (SocketTimeoutException e) {
if (retry == 0) throw e;
}
}
⚠️ 注意:
for (int i = 0; i < 3; i++) {
try {
// 请求
break;
} catch (SocketTimeoutException e) {
Thread.sleep((long) (1000 * Math.pow(2, i)));
}
}
System.setProperty("sun.net.client.defaultConnectTimeout", "3000");
System.setProperty("sun.net.client.defaultReadTimeout", "5000");
⚠️ 仅适用于 HttpURLConnection,不通用
连接超时:2~5 秒
读取超时:5~30 秒
| 场景 | 处理方式 |
|---|---|
| 连接慢 | connectTimeout |
| 响应慢 | readTimeout |
| 超时异常 | SocketTimeoutException |
| 失败重试 | 有限次 + 退避 |
| 高并发 | 禁用全局超时 |
如果你愿意,可以告诉我:
我可以给你一份更贴近你项目的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。