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

  • Socket de transferencia de una actividad a otra
  • Android VpnService proteger socket que se almacena en código nativo?
  • Socket Android: java.net.SocketException: No hay ruta para alojar
  • Acceda a la impresora a través de Wifi desde el dispositivo Android
  • Cómo resolver java.net.BindException: error de enlace: EADDRINUSE (Dirección ya en uso)
  • ¿Hay algún mecanismo de devolución de llamada en android cuando hay datos disponibles para leer en socket
  • La mejor manera de implementar Socket.io en android
  • Sockets, Threads y Servicios en android, ¿cómo hacerlos trabajar juntos?
  • Llegar a un dispositivo de red por IP y puerto mediante el emulador de Android
  • Comunicación entre dos aplicaciones usando emulador como servidor y cliente
  • Android juego multi-jugador a través de la red
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.