簡體   English   中英

HttpsUrlConnection在GET請求時獲取EOF異常

[英]HttpsUrlConnection getting EOF exception while GET request

我通過https從服務器獲取一些數據。 問題是,當我嘗試運行此代碼時,它只寫空字符串( response.toString()返回空)。 但是當我在BufferedReader行之前添加Thread.sleep方法時,它只是完美運行(從服務器返回完整數據)。 這里的主要問題是什么?

   private static void httpGet(String urlStr, String[] paramName, String[] paramVal) throws Exception {
    URL url = new URL(urlStr);
    HttpsURLConnection conn
            = (HttpsURLConnection) url.openConnection();
    conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod("GET");
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setUseCaches(false);
    conn.setAllowUserInteraction(false);
    conn.setRequestProperty(COOKIE_HEADER, param);

    if (conn != null) {
    //Thread.sleep(1000);
    BufferedReader in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
     System.out.println(response.toString());
    }
   }

好吧,你的代碼對我有用;-)甚至沒有Thread.sleep - 見下文 - 我從“Oracle”中提取數據。 另外請不要忘記關閉輸入流。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class URLConnectionReader {
public static void main(String[] args) throws Exception {
    URL url = new URL("https://www.oracle.com");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod("GET");
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setUseCaches(false);
    conn.setAllowUserInteraction(false);
    //conn.setRequestProperty("COOKIE_HEADER", param);

    if (conn != null) {
        // Thread.sleep(1000);
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        System.out.println(response.toString());
    }
}

}

HttpsUrlConnection在GET請求時獲取EOF異常

你沒有做GET請求。 您正在進行POST,但您沒有提供任何POST數據。

這里還有很多其他問題:

conn.setRequestMethod("GET");

這是默認值。 不要寫無意義的代碼。

conn.setDoOutput(true);

這會將請求方法更改為POST。 如果您不想執行POST,請刪除此行。

conn.setDoInput(true);

這是默認值。 不要寫無意義的代碼。

if (conn != null) {

conn不可能為null。 不要寫無意義的代碼。

//Thread.sleep(1000);

網絡代碼中的睡眠實際上是浪費時間。 不要使用它們,也不要認為它們可以解決網絡問題。 他們沒有。 他們可能會掩蓋他們一點,但潛在的問題仍然存在。

BufferedReader in = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }

在這里,您嘗試從POST中讀取響應,而無需編寫任何POST數據。 服務器可能會成為對象,可能是通過提前終止連接,這可能導致EOFException ,但不會出現在上面的readLine()代碼中。 由於您沒有提供堆棧跟蹤,因此無法進一步發表評論。 但是,除非存在服務器端問題,否則在修復上述錯誤后,您的代碼應該可以正常工作。

暫無
暫無

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

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