首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Jsoup 連線逾時異常處理:設定 timeout 參數完整指南

     編輯:Java 相關知識

解決 java.net.SocketTimeoutException: Read timed out

使用 Jsoup 爬取網頁時,預設連線逾時極短(約 3 秒),對回應緩慢的網站易拋出 SocketTimeoutException。透過 timeout(毫秒) 方法即可調整。

快速解決方案

// 設定 5 秒逾時(連線 + 讀取)
Document doc = Jsoup.connect("https://example.com").timeout(5000).get();

完整對比測試代碼

未設定 timeout(易發生逾時)

package jsoupTest;

import java.io.IOException;
import org.jsoup.*;
import org.jsoup.nodes.Document;

public class JsoupTest {
    public static void main(String[] args) throws IOException {
        String url = "https://www.jb51.net";
        long start = System.currentTimeMillis();
        Document doc = null;
        try {
            doc = Jsoup.connect(url).get(); // 無 timeout 設定
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("耗時:" + (System.currentTimeMillis() - start) + "ms");
        }
        if (doc != null) {
            System.out.println("Title: " + doc.title());
        }
    }
}

可能輸出:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    ...
耗時:3885ms
Exception in thread "main" java.lang.NullPointerException

設定 timeout(5000) 後穩定成功

package jsoupTest;

import java.io.IOException;
import org.jsoup.*;
import org.jsoup.nodes.Document;

public class JsoupTest {
    public static void main(String[] args) throws IOException {
        String url = "https://www.jb51.net";
        long start = System.currentTimeMillis();
        Document doc = null;
        try {
            doc = Jsoup.connect(url).timeout(5000).get(); // 5 秒逾時
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("耗時:" + (System.currentTimeMillis() - start) + "ms");
        }
        if (doc != null) {
            System.out.println("Title: " + doc.title());
        }
    }
}

進階連線參數配置

Document doc = Jsoup.connect(url)
    .timeout(10000)           // 連線與讀取總逾時 10 秒
    .userAgent("Mozilla/5.0") // 設定 User-Agent
    .referrer("https://google.com")
    .header("Accept", "text/html")
    .cookie("session", "id")
    .followRedirects(true)
    .maxBodySize(0)           // 0 表示不限制回應大小
    .get();

常見逾時相關異常

異常原因對策
SocketTimeoutException: Connect timed outTCP 三向交握超時增加 timeout、檢查防火牆/Proxy
SocketTimeoutException: Read timed out伺服器回應傳輸超時增加 timeout、啟用 gzip 壓縮
UnknownHostExceptionDNS 解析失敗檢查網路/DNS、改用 IP 直連
SSLHandshakeExceptionHTTPS 憑證驗證失敗信任憑證或使用 .validateTLSCertificates(false)

最佳實踐建議

  • 預設設定 timeout(10000) 以上,視目標站點回應速度調整。
  • 搭配 .ignoreHttpErrors(true) 讓 4xx/5xx 狀態碼不拋出異常,由業務邏輯判斷。
  • 生產環境建議使用 HttpClient 或 OkHttp 作為底層連線管理器,Jsoup 僅負責解析。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved