2016-08-23 293 views
1

我從https服務器獲取一些數據。問題是當我嘗試運行這段代碼時,它只是寫空字符串(response.toString()返回空)。但是,在BufferedReader行之前添加Thread.sleep方法的時候,它只是完美的(從服務器返回完整的數據)。這裏的主要問題是什麼?HttpsUrlConnection在獲取請求時獲取EOF異常

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()); 
    } 
    } 
+1

什麼是您的服務器代碼?這個客戶端代碼看起來非常好,所以請發佈你的服務器代碼,也許問題就在那裏。請將此代碼更新爲完整的方法,因爲這只是一小段代碼,並且可能包含在此代碼的信封中。 –

+0

@KrzysztofCichocki我沒有寫服務器代碼。我從Nessus應用程序獲取一些xml數據。 (https://discussions.tenable.com/docs/DOC-1172)。當我發佈我的登錄參數時,Nessus會返回一些會話令牌。這部分工作沒有任何問題,但是當我嘗試從Nessus獲得一些xml信息時,它只是沒有Thread.sleep沒有工作。 – hellzone

+0

嘗試刪除行「conn.setDoOutput(true);」如果這將不起作用,然後嘗試使用「conn.getOutputStream()。flush();」而不是「Thread.sleep()」,也許這會幫助你。 –

回答

0

那麼,你的代碼正在爲我工​​作;-)甚至沒有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()); 
    } 
} 

}

0

HttpsUrlConnection越來越EOF異常而GET請求

你是不是做一個GET請求。您正在執行POST,但您沒有提供任何POST數據。

這裏還有很多其他的問題:

conn.setRequestMethod("GET"); 

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

conn.setDoOutput(true); 

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

conn.setDoInput(true); 

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

if (conn != null) { 

conn此時不可能爲空。不要寫無意義的代碼。

//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數據。服務器將probaby對象,可能通過提前終止連接,這可能會導致EOFException,但不在上面的readLine()代碼中。由於您尚未提供堆棧跟蹤,因此無法進一步評論。但是,除非存在服務器端問題,否則在修復上述錯誤之後,您的代碼應該可以工作。

+0

此代碼不會拋出任何異常,但response.toString方法返回空字符串。(當我嘗試使用conn.getInputstream()我得到文件錯誤結束)當我添加thread.sleep方法response.toString方法返回數據服務器。我不明白爲什麼我需要添加Thread.sleep?什麼Thread.sleep在這裏做? – hellzone

+0

您不需要添加'Thread.sleep()'。我已經說過了。您需要修復上面列舉的幾個錯誤。您還沒有提供請求的堆棧跟蹤。 – EJP

+0

如果代碼沒有拋出任何異常,爲什麼你的問題提到'EOF異常'? – EJP