2 台の電話間でデータを交換する Android 用アプリを作成しようとしています。(Android 4.2.1 および 4.4.2) 基本として、Android チュートリアル セクションの BluetoothChat の例を使用しました。私の問題は次のとおりです。大量のデータ(> 1kB)を書き込むと、受信側が間違ったデータを取得することがよくあります。一見無関係なデータを受信することもあれば、多くの場合、連続する 0 のセクションを受信することもあれば、同じメッセージで以前に受信した部分を受信することさえあります。
送信の処理方法は次のとおりです: 最初に、4 バイトのヘッダーを送信します。これは、次のメッセージの長さとメッセージの種類 (プログラムがメッセージをどのように理解するかを示す 1 バイト) を提供します。次に、実際のメッセージを送信します。 .
私は BluetoothChat から ConnectedThread を使用しましたが、AsyncTask として実装しました。それ以外の場合は、次のように処理される受信を除いてまったく同じです: (および上記のように)
//code inside the doInBackground() section, and enclosed in a while + try block
byte[] header = new byte[4];
inputStream.read(header);
int messagelength = readHeader(header); // readHeader is the function that analyzes the 4 bytes header
byte[] message = new byte[messagelength];
inputStream.read(message); // read exactly that amount of bytes
readMessage(message); // this function takes the byte[] and transfers it into whatever is needed.
// in this example simply calling new String(message) and printing to the Log
送る側も全く同じ
write(byte[] bytes) {
outputStream.write(bytes); // I excluded the try/catch here
}
複数の文字列をテストし、単純に string.getBytes() を呼び出して変換すると、次のようになりました。
130 バイトの文字列が正しく送信され、
1443 バイトの文字列が正しく送信され、
51948 バイト文字列は、約 900 バイト後に失敗します。ログは、奇妙な「ひし形の疑問符」記号のみを出力するまで、文字列を正しく書き込みます。
ただし、失敗の瞬間はさまざまです。
outputStream.write(bytes) が処理できるバイト数に制限はありますか? Streams を介したこの単純なバイトの送信が失敗する理由を知っている人はいますか? 内部バッファの問題?たぶん循環バッファ(古いメッセージ部分が繰り返されることがあるため)?
助けてくれてありがとう、私はこの問題のために時間を失いました(小さなチャンクを書き込んだり読んだりしようとしましたが、それはあまり役に立ちませんでした)