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)
- Servicio de Android para sockets TCP
- Cliente-Servidor: Transferencia de archivos de Android a PC conectada vía socket
- Conexión de socket SSL
- ¿Cómo ejecutar el servicio no en el hilo principal?
- Android VpnService - ¿Cómo reenviar el tráfico interceptado de Internet?
//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.
- InetAddress.getLocalHost (). GetHostAddress () devuelve 127.0.0.1 en Android
- Mensajes de error NetlinkListener y NetlinkEvent
- Java socket IOException - permiso denegado
- Escucha un shoutcast con Android
- Audio de la corriente del androide al servidor
- ¿Cuál es el tiempo de espera predeterminado de java.net.Socket en android?
- Cómo enviar el archivo binario y el texto usando el mismo socket
- 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'
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:
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á.
- ¿Repetición de elementos en ListView?
- Cómo ocultar los valores del eje x en Barchart de mpandroidChart