2012-09-10 21 views
5

Necesito programar datos de 1 a 100 MB en fragmentos de 1024 bytes mediante programación en el dispositivo remoto Bluetooth. Ambos son dispositivos Android. Aquí es un fragmento de código de muestra en mi programa cliente para transferir datos -Bluetooth Android Socket OutputStream write blocks infinitamente

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(); 

Mientras se ejecuta este fragmento de código en Android 2.2 (Froyo), que funciona bien. Sin embargo, en el caso de Android 2.3.4 y 4.0.4, outStream.write (buffer) bloquea infinitamente después de la transferencia de algunos datos (digamos de 100 KB). Vale la pena mencionar que el dispositivo remoto no está configurado para escuchar datos. ¿Hay alguna limitación en la cantidad de datos que se pueden escribir?

+0

¿Estás diciendo que el otro lado no está leyendo datos del zócalo? –

+0

Precisamente, el servidor no está configurado para leer datos a través de la transmisión. –

Respuesta

5

La toma Bluetooth funciona en modo de bloqueo tanto para lecturas como para escrituras.

Si llena el búfer de envío, lo único que .write() puede hacer para evitar que intente enviar más datos es bloqueando. La alternativa al bloqueo sería devolver una "operación bloquearía". código de error, al igual que los sockets TCP pueden hacer cuando se coloca en modo no-bloqueo. Pero el conector Bluetooth no proporciona ningún modo de bloqueo similar.

Usted declara que el dispositivo Bluetooth remoto no está leyendo desde su socket. Siendo este el caso, el búfer de envío local y el búfer de recepción remota, con cada uno de ellos de un determinado tamaño finito, eventualmente se llenarán. En este punto, su operación .write() se bloqueará hasta que el extremo remoto lea algo de su socket. No puedes seguir extrayendo megabytes de datos y esperar que solo lo almacene todo en algún lugar.

Las diferencias que experimenta entre diferentes plataformas Android probablemente se deben a las diferentes cantidades de espacio de búfer disponibles en las pilas de Bluetooth relacionadas.

+0

Gracias por la respuesta Trevor. –

+0

@Trevor Gracias por la información. Nunca me he enfrentado a un problema de bloqueo durante mucho tiempo, incluso cuando traté de escribir miles de Kilobytes. Aunque todavía me pregunto cuál es el tamaño del búfer (con Android 2.3.3). –

Cuestiones relacionadas