2012-09-10 24 views
5

1から100MBのデータを1024バイトのチャンクでリモートBluetoothデバイスにプログラムで書き込む必要があります。どちらもアンドロイドデバイスです。ここでは、データを転送するために、私のクライアントプログラムのサンプルコードスニペットである - アンドロイド2.2(フローズンヨーグルト)上のコードのこの部分を実行している間Android BluetoothSocket OutputStream無限にブロックを書き込む

bTSocket.connect(); //connect to remote BT device 
DataOutputStream outStream = new DataOutputStream(bTSocket.getOutputStream()); 
byte[] buffer = new byte[1024]; 
int bytesToTransfer = 1000000; 
while (bytesToTransfer > 0) { 
    outStream.write(buffer); 
    outStream.flush(); 
    bytesToTransfer -= 1024; 
} 
outStream.close(); 

は、それが正常に動作します。しかし、Android 2.3.4と4.0.4の場合、outStream.write(バッファ)はデータの転送後に無限にブロックされます(たとえば100 KB)。言及すると言えば、リモートデバイスはリスニングデータ用に設定されていません。書き込めるデータの量に制限はありますか?

+0

もう一方の側がソケットからデータを読み取っていないと言っていますか? –

+0

正確には、サーバーはストリームを介してデータを読み取るように構成されていません。 –

答えて

5

Bluetoothソケットは読み取りと書き込みの両方でブロッキングモードで動作します。

送信バッファをいっぱいにすると、.write()がこれ以上データを送信しようとするのを止めることができます。これをブロックする代わりに、「操作はブロックする」と返すことになります。エラーコードは、非ブロックモードにしたときにTCPソケットと同じように動作します。しかし、Bluetoothソケットは、このような非ブロッキングモードを提供しません。

リモートBluetoothデバイスがソケットから読み取っていないことを指定します。この場合、ローカル送信バッファおよびリモート受信バッファは、各々が特定の有限のサイズを有するだけで、最終的にいっぱいになる。この時点で、あなたの.write()操作は、リモートエンドがソケットから何かを読み取るまでブロックされます。ポンピングをメガバイト単位で維持し、それをどこかにバッファリングするだけで済むわけではありません。

さまざまなAndroidプラットフォーム間での違いは、おそらく、関連するBluetoothスタックで使用可能なバッファスペースの量が異なることにあります。

+0

返信Trevorに感謝します。 –

+0

@トレヴァー情報をありがとう。私は数千キロバイトを書き込もうとしても、長時間ブロック問題に遭遇したことはありませんでした。私はまだバッファサイズが(Android 2.3.3を使用して)何か不思議です。 –

関連する問題