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.

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á.

  • Android VpnService - ¿Cómo reenviar el tráfico interceptado de Internet?
  • ¿Hay algún mecanismo de devolución de llamada en android cuando hay datos disponibles para leer en socket
  • Implementación cliente / servidor de socket TCP de Android
  • ¿Cómo puedo manejar múltiples clientes conectados a un servidor mediante sockets?
  • Recibe UDP en Android Marshmallow
  • Conexión HTTP de Android
  • El arranque del emulador atascó la estructura x86 en AOSP 4.3 con el emulador: Error al conectar con el zócalo '127.0.0.1:1970'
  • ¿Cómo puedo mantener mi aplicación en segundo plano?
  • Cliente Android / socket de servidor Java; Android enviar pero no recibir?
  • Comunicación de LocalSocket con el dominio de Unix en Android NDK
  • Androide, socket, programación, atrás, router
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.