1

サーバーの応答を受信するためにJavaソケットプログラミングを使用しています。メソッドchar arrayを使用して、その中の各応答を使用しています。read()

InputStream stream = null;
try{
    stream = socket.getInputStream();
}catch(Exception e){
    conn_lost();
}

if(stream != null){
    input = new BufferedReader(new InputStreamReader(
                    stream));

Looper.prepare();
char a[] = new char[1000];
for(int i =0; i < a.length; i++){
      a[i] = ' ';
   }

while (true){

   input.read(a);

   String response = String.valueOf(a);

   process_server_response(response);

   for(int i =0; i < a.length; i++){
         a[i] = ' ';
      }
}

問題は、サーバーから完全な応答を受信できない場合があり、代わりに半分のように受信し、その後の応答を残りの半分を受信することです。

言及する価値があります:

1-影響を受けた反応は、他の反応よりも少し大きいですが、 1000リットルを超えていないことは確かです。

2-サーバー側が完全に機能し、完了した応答を送信すると確信しています。

3-その動作を引き起こす可能性のあるタイプのターミネーターは存在しません。

4

1 に答える 1

2

問題は、サーバーから完全な応答を受信できない場合があり、代わりに半分のように受信し、その後の応答を残りの半分を受信することです。

はい。これがストリーム プロトコルのしくみです。への 1 回の呼び出しですべてのデータを受け取ると想定しないでくださいread()

同じストリームに複数のメッセージがある場合は、メッセージがどこで終了するかを知る方法が必要になります。1 つのメッセージ全体を読むことに頼ってはなりませread()が、次のメッセージはまったく読まないでください。

3 つの一般的なアプローチは次のとおりです。

  • 各メッセージの長さのプレフィックス
  • メッセージ間の区切り
  • 自己終了メッセージ (たとえば、終了タグに到達することでドキュメントの終わりを伝えることができる XML)

これらのスキームのいずれも設定していないが、複数のメッセージをネットワーク上に配置して個別に処理したい場合は、プロトコルが根本的に壊れているため、再検討する必要があります。

さらに、 を構築するときに適用するエンコーディングを指定する必要がありますInputStreamReader。プラットフォームのデフォルトをそのまま使用しないでください。

于 2014-07-01T12:22:55.350 に答える