2012-07-09 89 views
2

我已經編寫了用於從客戶端套接字發送/接收數據的代碼。發送數據步驟已成功完成,但是當我想從套接字讀取數據時,readLine()方法在沒有要讀取數據的情況下阻止程序。從Java客戶端套接字讀取數據

這是我的代碼:

StringBuffer document = new StringBuffer(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String line = null; 
while ((line = reader.readLine()) != null) 
    document.append(line + "\n"); 
reader.close() 

感謝所有 可以閱讀所有接收到的數據,但的readLine或讀取(字節[],INT,INT)方法阻止程序時沒有數據讀取,而此時這個方法必須返回null/-1。

+0

您正在交換基於字符的行格式的數據嗎? 當沒有足夠的數據可用於構建下一行時,您期望readLine()如何處理(如果不阻止)? – 2012-07-09 07:45:22

+0

我嘗試讀取(byte [],int,int)來讀取字節,但它再次被阻塞。對我來說這很奇怪,爲什麼read()會在沒有數據時阻塞。 – RedFlow 2012-07-09 07:59:42

回答

5

這是因爲readLine()函數是一個阻塞調用,所以它當然會阻塞。

爲了更有建設性,調用像readLine()這樣的方法應該在一個單獨的線程中,以便阻塞調用不會影響其餘代碼。從正在閱讀的課程中,我會建議創建一個純粹用於控制從套接字讀取的線程。

我會傳遞創建類的引用,以便如果線程收到信息,父類可以使用它。

0

BufferedReader有一個名爲'ready()'的方法,當數據準備好被接收時它返回true。如果您不希望在'readLine()'調用時被阻止,請首先檢查是否已準備好讀取數據。

Have a look at the documentation

相關問題