2016-06-26 224 views
-1

我試圖從服務器讀取響應。我有兩種方法。第一個不阻擋,但第二個阻止。我不理解爲什麼差..從套接字塊讀取

方法1:

public static String lireReponse() throws IOException, NullPointerException { 
    // recepteurReponses is a BufferedInputStream 
    String reponse = ""; 
    byte[] flux = new byte[1024]; 
    int i = recepteurReponses.read(flux); 
    reponse += new String(flux, 0, i); 
    return reponse; 
} 

方法2:

public static String lireDonnees() throws IOException, NullPointerException { 
    String reponse = ""; 
    byte[] flux = new byte[1024]; 
    int i = -1; 
    while ((i = recepteurReponses.read(flux)) != -1) 
     reponse += new String(flux, 0, i); 
    return reponse; 
} 
+0

'recepteurReponses'是否關閉過? –

+0

什麼使我確信第一種方法不會阻止是客戶端得到答案,我可以在控制檯中打印它。並且當客戶端向服務器發送CLOSE請求時,recepteurReponses被關閉 – Mouley

回答

0

第一種方法進行單個讀,未檢查流的末尾,並返回作爲字符串讀取的數據,或者在流結束的情況下拋出ArrayIndexOutOfBoundsException

第二種方法讀入循環,直到流結束,然後返回所有讀取的數據作爲單個字符串。

流的結束髮生在對等關閉連接時。如果對等方沒有關閉連接,則第二種方法將在讀取方法中阻塞。

+0

:O我看到我現在明白爲什麼它會阻止,我用第二種方法讀取大量數據,而不關閉連接。 Oki,告訴我如何讀取大量數據,如文本或消息,其中包含許多行而不關閉連接? – Mouley

+0

您必須在行之前發送長度或行數,或者使用XML等自描述協議。 – EJP

+0

感謝您的回答(y):) – Mouley