2012-02-24 7 views
0

私が取り組んでいるアプリケーションには2つの部分があります。サーバー部分は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

0

ここで私はこの問題を解決しました。私はクライアント側とサーバー側の両方を書く責任があるので、要求がサーバーに来ると、私が応答として送信する最初の行は、クライアントが期待できるバイト数です。このようにして、クライアントは最初に行の読み取りを待ちます。行が読み取られると、クライアントはサーバーから何バイトのデータを受け取るかを知るようになります。

他人に役立つことを願っています。

よろしく、
ピーター

関連する問題