2016-06-26 5 views
-1

サーバーからの応答を読み取ろうとしています。私には2つの方法があります。最初のものはブロックしませんが、2番目のブロックはブロックします。私は理解していない理由の違い..ソケットブロックから読み取る

方法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

私が最初の方法でブロックしないのは、クライアントが応答を得て、それをconsole.Andで印刷できるということです。クライアントがCLOSEリクエストをサーバーに送ると、recepteurReponsesは閉じます – Mouley

答えて

0

第1の方法は、単一の読み取りを行い、ストリームの終わりをチェックするために失敗し、読み込まれたデータをStringとして返します。ストリームの終了時には、ArrayIndexOutOfBoundsExceptionを返します。

2番目のメソッドは、ストリームの終了が発生するまでループを読み取り、読み取られたすべてのデータを単一の文字列として返します。

ピアが接続を閉じると、ストリームの終わりが発生します。ピアが接続を閉じない場合、2番目のメソッドはreadメソッドでブロックされます。

+0

:私は今なぜそれがブロックするか理解しています。私は接続を閉じることなく大量のデータを読み込むために2番目の方法を使用しました。 沖では、接続を閉じることなく多くの行を含むテキストやメッセージのような大量のデータを読み込む方法を教えてください。 – Mouley

+0

行の前に長さまたは行数を送信するか、XMLのような自己記述プロトコルを使用する必要があります。 – EJP

+0

回答ありがとうございます(y):) – Mouley

関連する問題