Cliente de Android enviar archivos grandes utilizando Socket, el archivo recibido por el servidor es incompleta

Quiero enviar un archivo grande de Android al servidor a través de socket, pero el archivo recibido por el servidor está incompleto.

Código en android:

Socket client = new Socket(ipStr, 4444); OutputStream outputStream = client.getOutputStream(); FileInputStream fileInputStream = new FileInputStream(file); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); byte[] buffer = new byte[512]; byte[] sendLen = getBytes(file.length(), true); outputStream.write(sendLen); outputStream.flush(); int count; while ((count = fileInputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, count); } outputStream.flush(); bufferedInputStream.close(); outputStream.close(); client.close(); 

Código en el servidor:

 byte[] recvHead = new byte[8]; inStream.read(recvHead, 0, 8); long recvLength = getLong(recvHead, false); FileOutputStream file = new FileOutputStream(fileName, false); byte[] buffer = new byte[8192]; int count = 0; while (count < recvLength) { int n = inStream.read(buffer); if(n == -1) break; file.write(buffer, 0, n); count += n; } 

Pero el servidor bloqueará en lectura (búfer) (el archivo android enviado es de unos 30M).

Aquí está la cosa extraña: Cuando agrego una salida al archivo mientras que envía el archivo, servidor puede trabajar correctamente.

  FileOutputStream file2 = new FileOutputStream("/sdcard/testfile" , false); while ((count = fileInputStream.read(buffer)) >= 0) { outputStream.write(buffer, 0, count); outputStream.flush(); file2.write(buffer, 0, count); file2.flush(); } 

¿Alguien puede ayudarme con esto? ¡Gracias!

    One Solution collect form web for “Cliente de Android enviar archivos grandes utilizando Socket, el archivo recibido por el servidor es incompleta”

    No puede suponer que lea los 8 bytes de longitud como ese. Usted podría haber leído tan poco como un byte en la matriz de longitud. Usaría DataInputStream.readLong () para eso, y DataOutputStream.writeLong () para escribirlo. O, como usted está cerrando después de un archivo, deshacerse de la palabra de longitud por completo y sólo leer hasta EOS.

    El resto del código se ve bien. Si el receptor bloquea en read () los datos siguen llegando, y el remitente sigue enviando.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.