0

特定の IP とポートをリッスンするサーバー ソケット アプリケーションがあります。次に、サーバーからの入力を読み取って応答するクライアントソケットがあります。しかし、私の問題は、サーバーがフォーマットされた行終端文字を最後に与えないことです。そのため、バッファリングされたリーダーの readline メソッドを使用すると、ハングします。サーバーから送信されたデータをどのように読み取る必要がありますか。ここでサーバーは基本的にAPI(METER)です。

サーバーとクライアント間の要求/応答シーケンスの例を次に示します。

Request: 8/2/2012 3:28:24 PM.60764 (+0.0000 seconds)
 53 0D                                             S.              
Answer: 8/2/2012 3:28:24 PM.87364 (+0.2656 seconds)
 53 50 31 39 35 30 34 37 38 34 0D                  SP19504784.     
Request: 8/2/2012 3:28:24 PM.92064 (+0.0000 seconds)
 53 48 0D                                          SH.             
Answer: 8/2/2012 3:28:24 PM.02964 (+0.1094 seconds)
 53 48 0D                                          SH.             
Request: 8/2/2012 3:28:24 PM.02964 (+0.0000 seconds)
 53 0D                                             S.              
Answer: 8/2/2012 3:28:24 PM.13964 (+0.1094 seconds)
 53 50 31 39 35 30 34 37 38 34 0D                  SP19504784.     
Request: 8/2/2012 3:28:24 PM.20164 (+0.0000 seconds)
 53 48 0D                                          SH.             
Answer: 8/2/2012 3:28:24 PM.31164 (+0.1094 seconds)
 53 48 0D                                          SH.             
Request: 8/2/2012 3:28:24 PM.31164 (+0.0000 seconds)
 80                                                ?               
Answer: 8/2/2012 3:28:24 PM.46764 (+0.1563 seconds)
 FC                                                ü               
Request: 8/2/2012 3:28:24 PM.46764 (+0.0000 seconds)
 F1                                                ñ               
Answer: 8/2/2012 3:28:25 PM.84264 (+0.3750 seconds)
 8A 31 39 35 30 34 37 38 34 88                     ?19504784?      
Request: 8/2/2012 3:28:25 PM.90464 (+0.0000 seconds)
 F1                                                ñ               
Answer: 8/2/2012 3:28:25 PM.02964 (+0.1250 seconds)
 8A 01 41 32 4D 47 30 31 42 B1                     ?.A2MG01B±      
Request: 8/2/2012 3:28:26 PM.81164 (+0.0000 seconds)
 CA F0 00 00 00 00 00 00 00 3A                     Êð.......:      
Answer: 8/2/2012 3:28:26 PM.02964 (+0.2188 seconds)
 C4 00 05 00 C9 31 36 38 C4 B7 B7 3F 2E C9 74 5A   Ä...É168Ä··?.ÉtZ
 02 00 02 00 FE FC C9 A1 0D 07 00 FB FF FD FC C9   ....þüÉ¡...ûÿýüÉ
 1E 0E FD FF FE FF FD FC C9 B8 FE 4E FF FA 01 FF   ..ýÿþÿýüɸþNÿú.ÿ
 FF B9 D0 F9 F0 3F D0 BF 50 9F                     ÿ¹Ðùð?пP?      
4

2 に答える 2

0

readline()サーバーが行末を送信しない場合は使用できません。ただし、生のプロトコルの何かが、応答がいつ完了したかを示す必要があります。これは、

  1. 特定の文字列
  2. 各コマンドへの応答 (サンプルの「要求」) には、既知の固定長があります
  3. 各応答には、先頭からの固定オフセットに埋め込まれた長さが含まれます

独自のバッファリングを行い、各メッセージの終わりを自分で検出する必要があります。使用されているプロトコルの詳細な説明がなければ、それはあなたが期待できるほど具体的な答えです.

于 2012-08-07T18:38:27.097 に答える
0

BufferedReader の read メソッドの 1 つを試して、データの中断を自分で処理することができます。それはおそらくあなたが持っている最高のコントロールです。

于 2012-08-07T18:39:53.237 に答える