Sto provando a trasferire circa un megabyte di dati arbitrari alla volta da un telefono Android a un altro. Attualmente, scrivo le dimensioni, un codice di comando e i dati su un DataOutputStream
attorno a un BufferedOutputStream
, attorno allo OutputStream
restituito da bluetoothSocketInstance.getOutputStream()
.Trasferimento di grandi quantità di dati tramite Bluetooth su Android Gingerbread
Il telefono ricevente legge la dimensione e il codice di comando e quindi legge dal flusso di input finché non ha ottenuto tutti i dati che si aspetta. Funziona per stringhe brevi, ma per i file più grandi non tutti i dati vengono trasferiti. L'esecuzione dell'app nel debugger mostra che la scrittura ritorna senza eccezioni e la lettura legge una frazione dei byte attesi e quindi blocca indefinitamente. Inoltre non getta alcuna eccezione.
C'è un buffer da qualche parte che si sta riempiendo? C'è qualcos'altro che devo fare per garantire che tutti i dati vengano trasferiti?
Il mio codice per il mittente e il destinatario sono al di sotto:
mittente:
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);
}
}
Ricevitore:
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;
}
Il buffer di invio Bluetooth è 70 KiB nel codice nativo di BluetoothSocket (nella mia copia). Inoltre, Linux lo raddoppia internamente (a causa delle "strutture dati del kernel"). Tuttavia, questo non dovrebbe essere un problema poiché 'write (3)' dovrebbe gestirlo. Inoltre, flush non può fare nulla (perché la scrittura sembra essere sincrona) e (flush) non viene sovrascritta. – yingted