InputStream no recibe EOF

Estoy intentando enviar una imagen de mi dispositivo del androide a mi computadora vía un zócalo. El problema es el flujo de entrada en mi computadora se lee en cada byte, pero el último conjunto de ellos. He intentado recortar la matriz de bytes hacia abajo y enviarlo, he escrito manualmente -1 en el outputstream varias veces, pero el inputtream nunca lee -1. Simplemente se cuelga esperando datos. También he intentado no cerrar la corriente o los zócalos para ver si era una cierta clase de asunto de la sincronización, pero eso no trabajó también.

Lado del cliente (teléfono Android)

//This has to be an objectoutput stream because I write objects to it first InputStream is = An image's input stream android ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); objectOutputStream.writeObject(object); objectOutputStream.flush(); byte[] b = new byte[socket.getSendBufferSize()]; int read = 0; while ((read = is.read(b)) != -1) { objectOutputStream.write(b, 0, read); objectOutputStream.flush(); b = new byte[socket.getSendBufferSize()]; } //Tried manually writing -1 and flushing here objectOutputStream.close(); is.close(); socket.close(); 

Lado del servidor (equipo) Este bit de código tiene lugar después de leer el flujo de entrada de objetos en los objetos enviados. Sólo empieza a leer cuando el archivo comienza a enviar

 File loc = Location of where the file is stored on the computer loc.createNewFile(); FileOutputStream os = new FileOutputStream(loc); Socket gSocket = The socket ObjectInputStream gInputStream = Object Input stream created from the sockets input stream already used to read in the previous objects byte[] b = new byte[gSocket.getReceiveBufferSize()]; int read = 0; while ((read = gInputStream.read(b)) != -1) { os.write(b, 0, read); os.flush(); b = new byte[gSocket.getReceiveBufferSize()]; } os.close(); 

Este código nunca se lee en -1 aunque escribo -1 directamente y enjuague la secuencia. El resultado es java.net.SocketException: Conexión restablecida cuando se cierra el flujo o el socket del dispositivo android. La imagen se envía casi por completo, pero los últimos píxeles de la imagen son de color gris. Incluso he intentado usar el flujo de salida / entrada directamente desde el zócalo en lugar de usar el objectinputstream / objectoutputstream ya creado y todavía no funciona.

3 Solutions collect form web for “InputStream no recibe EOF”

En primer lugar, creo que ha entendido mal el significado de EOF (-1). No significa que el servidor escribió un -1, significa que el servidor cerró el flujo.

Creo que su principal problema es que tanto el servidor y el cliente están leyendo en un bucle, y ni llegar al punto donde cierran la secuencia. Están en un punto muerto – ambos están esperando a que el otro cierre primero.

Tu cliente:

Tu cliente

Su servidor:

Su servidor

Si sabe que no tiene más datos que escribir, simplemente cierre el flujo.

Puesto que ya está utilizando ObjectInputStream y ObjectOutputStream , puede utilizar sus respectivos métodos readObject y writeObject para leer / escribir objetos enteros a la vez. ¿Tal vez podría enviar / recibir toda la matriz de bytes como un objeto?

En tu androide:

1) byte [] imageBytes = …; // contiene la imagen

2) objectOutputStream.writeObject (imageBytes);

En tu ordenador:

1) byte [] imageBytes = (byte []) readObject ();

2) obtener la imagen de imageBytes

Por supuesto, tendrás que usar readObject desde dentro de un hilo puesto que bloqueará.

Está escribiendo byte [] arrays como objetos, bur bytes de lectura. Debería estar leyendo Objetos y convertirlos en byte []. EOS causará una EOFException que se lanzará.

  • Conexión de dos teléfonos Android para transferir datos entre ellos a través de WIFI
  • UDP Multicasting desde el móvil a la PC
  • ¿Cómo ejecutar el servicio no en el hilo principal?
  • Android: ¿Cómo detectar la aplicación eliminada de la lista de aplicaciones recientes?
  • HTTP Vs sockets Vanilla para cargar archivos binarios grandes (50-200 MB) desde un dispositivo Android a través de una red Wi-Fi de un solo salto
  • Socket Connection Timeout en el teléfono Android
  • ¿Cómo asociar la intención de conectividad a socket?
  • Crear SSLSocket por SSLSocketFactory con tiempo de espera de conexión establecido
  • Conexión entre Python Server y la aplicación Android
  • Acceso a WebView desde otra función en la clase MainActivity
  • 'Permiso denegado' al conectarse al socket unix abstracto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.