2012-02-24 60 views
0

我正在處理的應用程序有兩個部分。服務器部分在Linux機器上運行。客戶端部分(一個Android應用程序)查詢服務器並獲得必要的響應。這兩個部分都是用Java編寫的,使用基於套接字的通信以及傳輸文本數據。讀取套接字數據的可靠方法

右鍵發送請求後,這裏是客戶端如何接收響應:

public static String ReadAvailableTextFromSocket(BufferedReader input) throws IOException { 
    if (input.ready() == false) { 
    return null; 
    } 
    StringBuilder retVal = new StringBuilder(); 
    while(input.ready()) { 
    char ch = (char) input.read(); 
    retVal.append(ch); 
    } 
    return retVal.toString(); 
} 

然而,這似乎並沒有是可靠的。由於服務器響應時間或傳輸延遲,輸入並不總是準備就緒。

看起來像input.ready()不是等待獲取數據的正確方法。

我想知道是否有更好的方法來實現這一點。也許有一些我可以使用的標準做法。

回答

0

也許你應該使用Threads。在一個while(true)循環中保留一個監聽器線程,該循環在進入時讀取更多數據,並簡單地將數據緩存到與主線程共享的數據結構(比方說隊列)中。這樣,主線程可以根據需要簡單地出隊數據。如果隊列爲空,則可以推斷沒有收到新數據。

編輯:看這multithreaded chat server/client代碼爲例。

+0

謝謝你的幫忙。數據當前正在後臺線程中接收。不過,我認爲問題仍然沒有消失。一些線程,無論是後臺還是前臺,都需要等待一段時間,然後再決定數據不會來。我想我可能不得不介紹關於多久等待數據的概念。 – Peter 2012-02-24 19:03:23

0

這是我如何解決這個問題。由於我負責編寫客戶端和服務器端,當請求到達服務器時,我發送的作爲響應的第一行信息是客戶端可以預期的字節數。這樣,客戶端首先等待讀取一行。一旦讀取了該行,客戶端現在知道要從服務器獲得多少字節的數據。

希望這可以幫助別人。

Regards,
Peter