es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android – El cliente cierra la conexión cuando se envía una imagen, antes de recibir una cadena de regreso.

Tengo una aplicación de Android que abre una conexión de socket con el servidor y envía una imagen a un servidor de Python. El servidor recibe esa imagen y se supone que envía una cadena de vuelta para confirmar que la imagen ha sido recibida. Sin embargo, el socket se cierra después de que termino la secuencia de salida, por lo tanto, el servidor recibe la imagen, pero el cliente no puede recibir una cadena del servidor porque el cliente cerró la conexión.
Por lo tanto, lo que quiero hacer es devolver una cadena/texto que confirme que la imagen ha llegado al cliente de usuario antes de que se cierre el socket.

Este es mi servidor de Python que recibe la imagen como bytes decodifica y lo guarda en un directorio luego envía un mensaje de vuelta:

Estoy tratando de recibir la cadena codificada en mi cliente Android e imprimir/mostrar una tostada.

Código de cliente de Android:

Además, noté que hacer out.close() también cerrará el socket de transmisión. Aquí está el registro después de que se envía y recibe una imagen por el servidor:

Si intento mover out.close() después del bucle while, el cliente enviará una cantidad infinita de datos al servidor y cuando cierre el servidor para terminar los datos infinitos que se reciben, en lugar de una imagen de 70Kb, tendré una imagen de 10MB o más dependiendo de cuánto tiempo haya recibido los bytes.

Por lo que parece, creo que tendría que detener de alguna manera que se envíe la imagen sin cerrar el servidor para escuchar la imagen que se envía de vuelta. ¿Cómo puedo hacer eso sin cerrar el socket?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el comportamiento deseado, debe mover la llamada out.close() después del ciclo que lee la respuesta del servidor. Esto se debe a que out.close() también cierra el socket subyacente.

    Además, según el código que proporcionó, no está enviando ninguna respuesta desde el servidor al cliente. Después de que el servidor reciba la imagen, debe enviar una respuesta indicando que se ha recibido la imagen, antes de cerrar la conexión.

    Para implementar esto, puede agregar el siguiente código después de la línea file.write(data) en el código del servidor:

    # enviar respuesta al cliente
    conn.sendall(b"Imagen recibida")
    

    Luego, en el código del cliente, puede leer la respuesta del servidor después de enviar la imagen, de la siguiente manera:

    dataOutputStream.write(voids[0],0,voids[0].length);
    String response = input.readLine();
    // mostrar un mensaje de confirmación indicando que se ha recibido la imagen
    Toast.makeText(getApplicationContext(), "Imagen recibida: " + response, Toast.LENGTH_SHORT).show();
    

    Esto debería mostrar un mensaje de confirmación en el cliente indicando que el servidor ha recibido la imagen, y evitar que el socket se cierre prematuramente.

Comments are closed.