簡體   English   中英

如何超時讀取Java Socket?

[英]How to timeout a read on Java Socket?

我正在嘗試從套接字讀取項目,我注意到如果套接字流中沒有任何內容,它將停留在讀取狀態並備份我的應用程序。 我想知道是否有辦法設置讀取超時或在套接字中沒有任何內容一段時間后終止連接。

如果您編寫 Java,學習瀏覽API 文檔會很有幫助。 在套接字讀取的情況下,您可以設置超時選項,例如:

socket.setSoTimeout(500);

這將導致與套接字關聯的InputStreamread()調用阻塞半秒后拋出SocketTimeoutException 需要注意的是SocketTimeoutException在此類read()調用拋出的異常中是唯一的,因為套接字仍然有效; 你可以繼續使用它。 異常只是一種逃避讀取並決定是否該做一些不同的事情的機制。

while (true) {
    int n;
    try {
        n = input.read(buffer);
    catch (SocketTimeoutException ex) {
        /* Test if this action has been cancelled */
        if (Thread.interrupted()) throw new InterruptedIOException();
    }
    /* Handle input... */
}

如果此套接字是通過URLConnection創建的以執行 Web 請求,則可以在讀取流之前直接在URLConnection上設置讀取和連接超時:

InputStream createInputStreamForUriString(String uriString) throws IOException, URISyntaxException {
    URLConnection in = new URL(uriString).openConnection();
    in.setConnectTimeout(5000);
    in.setReadTimeout(5000);
    in.setAllowUserInteraction(false);
    in.setDoInput(true);
    in.setDoOutput(false);
    return in.getInputStream();
}

是的,應該有一個接受超時值的 Read() 覆蓋。 通過“覆蓋”,我不是建議任何人一個,我是指出他正在使用的套接字方法的覆蓋之一采用超時值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM