2011-11-11 22 views
5

私は、一度に1メガバイトの任意のデータをAndroid携帯から別の携帯に転送しようとしています。現在、サイズ、コマンドコード、データをBufferedOutputStreamの周りのDataOutputStreamに、OutputStreamの周りには、bluetoothSocketInstance.getOutputStream()から返されます。Androidのジンジャーブレッドでブルートゥースで大量のデータを転送する

受信側の電話機は、サイズとコマンドコードを読み取り、入力ストリームから、それが予想しているすべてのデータを取得するまで読み取ります。これは短い文字列では機能しますが、大きなファイルではすべてのデータが転送されるわけではありません。デバッガでアプリケーションを実行すると、書き込みが何の例外もなく返され、読み込みで予想されるバイトの一部が読み込まれ、その後無期限にブロックされます。また、例外をスローしません。

バッファがいっぱいになっていますか?すべてのデータが確実に転送されるようにするために何か必要なことはありますか?

送信者と受信者のための私のコードは以下の通りです:

送信者:

try { 

      DataOutputStream d = new DataOutputStream(new BufferedOutputStream(mmOutStream,buffer.length+8)); 
      //int b= buffer.length; 
      d.writeInt(buffer.length); 
      d.writeInt(command); 

      d.write(buffer); 
      d.flush(); 

     } catch (IOException e) { 
      Log.e(TAG, "Exception during write", e); 
     } 
    } 

がReceiver:

try { 

       // Read from the InputStream 
       int messageSize= inStream.readInt(); 
       int messageCode = inStream.readInt(); 
       bytes=0; 
       buffer =new byte[messageSize]; 
       while(bytes < messageSize) 
       { 
        bytes += inStream.read(buffer,bytes,messageSize - bytes); 

       } 
        message = bytes; 
      } catch (IOException e) { 
       Log.e(TAG, "disconnected", e); 
       connectionLost(); 
       break; 
      } 

答えて

3

私の最後のいくつかのより多くのテストの後、私は自分の送信コードへの変更しました次のようになります。

for(int i=0; i<buffer.length;i+=BIG_NUM) 
      { 
       int b = ((i+BIG_NUM) < buffer.length) ? BIG_NUM: buffer.length - i; 
       d.write(buffer,i,b); 
       d.flush(); 
      } 

ファイルが送信されます。なぜ誰かがアイデアを持っていますか? flush()への呼び出しは、データが実際に転送されるまでブロックされますか?どのくらい大きく安全に私がBIG_NUMを作ることができるかを決めるのに役立つ送信バッファと受信バッファのサイズに関するドキュメントはありますか?

+0

ブルートゥース送信バッファはBluetoothSocketネイティブコード(私のコピーで)で70KBです。また、Linuxはこれを内部的に2倍にします(「カーネルデータ構造」のため)。しかし、 'write(3)'がこれを管理する必要があるので、これは問題ではありません。また、flushは何もしないかもしれません(書き込みは同期的であると思われるので)、それは上書きされません。 – yingted

0

私にも同様の問題がありますが、ファイルを送信するときに欠けている部分があります。 BufferedOutputStreamを試してみましたが、まだ問題があります。

最終的に私は簡単な解決策を見つける:

あなたは、バッファの長さを送信するために必要なだけ(例えば[8192])バイト配列にバッファを送る分割し、上サイドを受けていないが、このバッファがはるかに大きいことを確認してください送信バッファの約4倍または8倍。これは私のために働いて、ファイルが完了した送信されます。

+0

これは、私が問題を解決する方法と似ています。私はそれを分割する前に送信バッファの最大サイズを知ることができますか? – ethan

関連する問題