El envío de un archivo de imagen desde un teléfono Android a un PC a través de Python utilizando sockets

Leena:

Quiero enviar una imagen de mi dispositivo Android a través de tomas de pitón, he tenido éxito en el envío de texto de Android-Python. Cuando envío la imagen consigo el brindis de la imagen que está siendo enviado, pero en el extremo receptor de la imagen está dañada con un tamaño de 0 KB Agradezco cualquier ayuda, ya que actualmente estoy atascado aquí.

Aquí está mi código

image.py

from socket import *

port = 8888
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', port))
s.listen(1) #listens to 1 connection
conn, addr = s.accept()
print("Connected by the ",addr)

while True:
    data = conn.recv(1024)
    with open('image.jpg', 'wb') as file:
       file.write(data)


conn.close() 

El código del lado del Android es,

public void send(View v) {
        Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("image/*");
        startActivityForResult(i, 1);
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (requestCode == 1 && resultCode == RESULT_OK) {

            try {
                final Uri imageUri = data.getData();
                final InputStream imageStream = getContentResolver().openInputStream(imageUri); 
                final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
                imageView.setImageBitmap(selectedImage);

                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
                byte[] array = byteArrayOutputStream.toByteArray();

                SendImageClient sendImageClient = new SendImageClient();
                sendImageClient.execute(array);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

        } else {
            Toast.makeText(this, "no image selected", Toast.LENGTH_SHORT).show();
        }

    }


 public class SendImageClient extends AsyncTask<byte[], Void, Void> {


        @Override
        protected Void doInBackground(byte[]... voids) {

            try {
                Socket socket= new Socket("192.168.0.106",8888);

                OutputStream out=socket.getOutputStream();
                DataOutputStream dataOutputStream=new DataOutputStream(out);
                dataOutputStream.writeInt(voids[0].length);
                dataOutputStream.write(voids[0],0,voids[0].length);
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Image sent", Toast.LENGTH_SHORT).show();
                    }
                });

                dataOutputStream.close();
                out.close();
                socket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }


            return null;
        }
    }

Joni:

Su código Python es truncar el archivo de salida en cada ejecución del bucle. En la última vuelta, cuando se cierra la conexión, el archivo se trunca, conn.recvdevolverá una cadena vacía, y nada más se escribe en el archivo.

Mover with open(..)fuera del bucle que lee desde el zócalo y manejar el cierre de conexión de modo que usted no tiene un bucle infinito:

with open('image.jpg', 'wb') as file:
    while True:
        data = conn.recv(1024)
        if not data: break
        file.write(data)

Su código de Java está enviando el tamaño de los datos se envían antes de los datos en sí - se debe quitar esto o ajustar el código Python para tener esto en cuenta.

            dataOutputStream.writeInt(voids[0].length);
            dataOutputStream.write(voids[0],0,voids[0].length);

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=410107&siteId=1
Recomendado
Clasificación