elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  enviar un BufferedImage a travez de socket
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: enviar un BufferedImage a travez de socket  (Leído 21,371 veces)
egyware


Desconectado Desconectado

Mensajes: 526



Ver Perfil WWW
enviar un BufferedImage a travez de socket
« en: 22 Agosto 2007, 22:55 pm »

ola estoy haciendo un programa (un casi troyano) que toma screenshoot del  server y los envia al client pero el problema es que no se como hacerlo y he buscado en google pero me he encontrado el mismo problema en otro idioma pero igual dejo un post aqui si alguien tiene una solucion mi problema es como un objeto BufferedImage lo paso a outputStream y lo paso por un socket y en el client de un inputStream a BufferedImage y pintarlo en pantalla
gracias de antemano
adiozzzz


En línea

Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Re: enviar un BufferedImage a travez de socket
« Respuesta #1 en: 23 Agosto 2007, 19:22 pm »

Lo primero a tener en cuenta es que para que un objeto pueda ser usado por sockets, es necesario que dicho objeto sea Serializable, es decir que implemente dicha clase. El problema es que la clase BufferedImage no implementa la interfaz Serializable.

De momento no se me ocurre nada, voy a echarle un vistazo a ver de que va la vaina.

Un saludo!


En línea

Yshua

Desconectado Desconectado

Mensajes: 51


Yeshúa Ha Mashiaj... Mikamoha belim Adonai


Ver Perfil WWW
Re: enviar un BufferedImage a travez de socket
« Respuesta #2 en: 23 Agosto 2007, 19:40 pm »

yo ya eh hecho eso.
hay como en todo muchas formas.
una es crear un objeto de ImageIcon, q si es serializable,  y pasarlo por un socket con las clases ObjectInputStream y ObjectOutputStream, sin embargo, no recomiendo para nada este metodo pues cada imageIcon pesa unos 3 Mb, por lo q es demasiado lento.
otra forma entonces es convertir el BufferedImage a un byte[] eso se hace creando un objeto de ByteArrayOutputStream , y pasarlo como parametro al metodo estatico ImageIO.write()(este metodo tiene mas parametros) luego que escribiste la imagen en el ByteArrayOutputStream esta clase tiene un metodo toByteArray y retorna un byte[], luego ese byte[] lo envias f{acilmente por sockets. es algo como eso. esa si la recomiendo. cada imagen, dependiendo de la resolucion estara entre los 50 y los 200 Kb.
no explico como hacerlo explicitamente por q no lo recuerdo exacto en este momento. pero puedes mirar como hacerlo.
En línea


Baruj aba beshem Adonai.
<a href="http://www.cp666group.com">visita mi sitio CP666GROUP</a>
Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Re: enviar un BufferedImage a travez de socket
« Respuesta #3 en: 23 Agosto 2007, 21:07 pm »

Inspirado en las bonitas palabras de Yshua, he intentado lo que dice y el resultado es el siguiente:

Clase Receptor.java: Se queda a la espera/escucha de conexiones en determinado puerto y recibe una imagen. En este caso he guardado la imagen en un archivo, pero las posibilidades son muchas:
Código
  1. import java.io.*;
  2. import java.net.*;
  3. import java.awt.image.BufferedImage;
  4. import javax.imageio.ImageIO;
  5. public class Receptor{
  6.    private ObjectInputStream entrada;
  7.    private ServerSocket servidor;
  8.    private Socket conexion;
  9.    public void ejecutarServidor() {
  10.        try {
  11.            servidor = new ServerSocket( 12345, 100 );
  12.            while ( true ) {
  13.                try {
  14.                    esperarConexion();
  15.                    entrada = new ObjectInputStream( conexion.getInputStream() );
  16.                    System.out.println( "\nSe recibieron los flujos de entrada\n" );
  17.                    procesarConexion();
  18.                } catch ( EOFException excepcionEOF ) {
  19.                    System.err.println( "El servidor terminó la conexión" );
  20.                    excepcionEOF.printStackTrace();
  21.                } finally {
  22.                    cerrarConexion();   // Paso 5: cerrar la conexión.
  23.                }
  24.            } // fin de instrucción while
  25.        } // fin del bloque try
  26.        catch ( IOException excepcionES ) {
  27.            excepcionES.printStackTrace();
  28.        }
  29.  
  30.    } // fin del método ejecutarServidor
  31.    // esperar que la conexión llegue, después mostrar información de la conexión
  32.    private void esperarConexion() throws IOException {
  33.        System.out.println( "Esperando una conexión\n" );
  34.        conexion = servidor.accept(); // permitir al servidor aceptar la conexión
  35.        System.out.println( "Conexión recibida de: " + conexion.getInetAddress().getHostName() );
  36.    }
  37.    // procesar la conexión con el cliente
  38.    private void procesarConexion() throws IOException {
  39.        do { // procesar los mensajes enviados por el cliente
  40.  
  41.            // leer el mensaje y mostrarlo en pantalla
  42.            try {
  43.                byte[] bytesImagen = (byte[]) entrada.readObject();
  44.                ByteArrayInputStream entradaImagen = new ByteArrayInputStream(bytesImagen);
  45.                BufferedImage bufferedImage = ImageIO.read(entradaImagen);
  46.  
  47.                String nombreFichero=System.getProperty("user.home")+File.separatorChar+"captura.jpg";
  48.                System.out.println("Generando el fichero: "+nombreFichero );
  49.                FileOutputStream out = new FileOutputStream(nombreFichero);
  50.                // esbribe la imagen a fichero
  51.                ImageIO.write(bufferedImage, "jpg", out);
  52.            }
  53.  
  54.            // atrapar problemas que pueden ocurrir al tratar de leer del cliente
  55.            catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
  56.                System.out.println( "\nSe recibió un tipo de objeto desconocido" );
  57.            }
  58.  
  59.        } while ( true );
  60.  
  61.    } // fin del método procesarConexion
  62.    // cerrar flujos y socket
  63.    private void cerrarConexion() {
  64.        System.out.println( "\nFinalizando la conexión\n" );
  65.        try {
  66.            entrada.close();
  67.            conexion.close();
  68.        } catch( IOException excepcionES ) {
  69.            excepcionES.printStackTrace();
  70.        }
  71.    }
  72.    public static void main( String args[] ) {
  73.        Receptor aplicacion = new Receptor();
  74.        aplicacion.ejecutarServidor();
  75.    }
  76. }

Clase Cliente.java: Ésta clase toma una captura de la pantalla, y luego envía dicha imágen como un arreglo de bytes al servidor especificado.
Código
  1. import java.io.*;
  2. import java.net.*;
  3. import javax.imageio.ImageIO;
  4. import java.io.Serializable;
  5. import java.awt.AWTException;
  6. import java.awt.Rectangle;
  7. import java.awt.Robot;
  8. import java.awt.Toolkit;
  9. import java.awt.image.BufferedImage;
  10. public class Cliente{
  11.    private ObjectOutputStream salida;
  12.    private String servidorChat;
  13.    private Socket cliente;
  14.  
  15.    public Cliente( String host ) {
  16.        servidorChat = host; // establecer el servidor al que se va a conectar este cliente
  17.    }
  18.    private void ejecutarCliente() {
  19.        try {
  20.            conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
  21.            salida = new ObjectOutputStream( cliente.getOutputStream() );
  22.            salida.flush(); // vacíar búfer de salida para enviar información de encabezado
  23.            System.out.println( "\nSe recibieron los flujos de E/S\n" );
  24.            enviarDatos();
  25.        } catch ( EOFException excepcionEOF ) {
  26.            System.err.println( "El cliente termino la conexión" );
  27.        }
  28.  
  29.        // procesar los problemas que pueden ocurrir al comunicarse con el servidor
  30.        catch ( IOException excepcionES ) {
  31.            excepcionES.printStackTrace();
  32.        }
  33.  
  34.        finally {
  35.            cerrarConexion(); // Paso 4: cerrar la conexión
  36.        }
  37.  
  38.    } // fin del método ejecutarCliente
  39.  
  40.    // conectarse al servidor
  41.    private void conectarAServidor() throws IOException {
  42.        System.out.println( "Intentando realizar conexión\n" );
  43.        // crear Socket para realizar la conexión con el servidor
  44.        cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 );
  45.        // mostrar la información de la conexión
  46.        System.out.println( "Conectado a: " +
  47.                cliente.getInetAddress().getHostName() );
  48.    }
  49.    // cerrar flujos y socket
  50.    private void cerrarConexion() {
  51.        System.out.println( "\nCerrando conexión" );
  52.        try {
  53.            salida.close();
  54.            cliente.close();
  55.        } catch( IOException excepcionES ) {
  56.            excepcionES.printStackTrace();
  57.        }
  58.    }
  59.    private void enviarDatos( ) {
  60.        Rectangle rectangleTam = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
  61.        try {
  62.            Robot robot = new Robot();
  63.            BufferedImage bufferedImage = robot.createScreenCapture(rectangleTam);
  64.            ByteArrayOutputStream salidaImagen = new ByteArrayOutputStream();
  65.            ImageIO.write(bufferedImage, "jpg", salidaImagen);
  66.            byte[] bytesImagen = salidaImagen.toByteArray();
  67.            salida.writeObject( bytesImagen );
  68.            salida.flush();
  69.            System.out.println( "Se ha enviado la imagen" );
  70.        } catch (AWTException e) {
  71.            e.printStackTrace();
  72.        } // procesar los problemas que pueden ocurrir al enviar el objeto
  73.        catch ( IOException excepcionES ) {
  74.            System.out.println( "\nError al escribir el objeto" );
  75.        }
  76.    }
  77.  
  78.    public static void main( String args[] ) {
  79.        Cliente aplicacion;
  80.  
  81.        if ( args.length == 0 )
  82.            aplicacion = new Cliente( "127.0.0.1" );
  83.        else
  84.            aplicacion = new Cliente( args[ 0 ] );
  85.  
  86.        aplicacion.ejecutarCliente();
  87.    }
  88.  
  89. } // fin de la clase Cliente

El programa funciona!!! Pero... me sale una excepción que no he sabido depurar:

Código:
java.io.EOFException
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at Receptor.procesarConexion(Receptor.java:43)
        at Receptor.ejecutarServidor(Receptor.java:17)
        at Receptor.main(Receptor.java:74)

Eso sucede después de que la imágen ya ha sido creada, y el problema es que la imágen no queda bien al 100% o algo raro pasa, es decir, puedes ver la imagen con el Gimp o Paint (que comparación tan burda XD), pero con el visor de imágenes de Windows no.

Y pues no sé como solucionar el problema :-\
En línea

Yshua

Desconectado Desconectado

Mensajes: 51


Yeshúa Ha Mashiaj... Mikamoha belim Adonai


Ver Perfil WWW
Re: enviar un BufferedImage a travez de socket
« Respuesta #4 en: 24 Agosto 2007, 22:03 pm »

que bien q te haya sido de ayuda, lo q escribí.
para lo de la excepcion trata cerrando el flujo out. no se no se me ocurre nada más.
En línea


Baruj aba beshem Adonai.
<a href="http://www.cp666group.com">visita mi sitio CP666GROUP</a>
egyware


Desconectado Desconectado

Mensajes: 526



Ver Perfil WWW
Re: enviar un BufferedImage a travez de socket
« Respuesta #5 en: 25 Agosto 2007, 17:10 pm »

gracias por la ayuda, ayer estuve como a las 4 de la  mañana(-4 GMT) tratando de enviar el bufferedImage mejor dicho recibirlo porque lo enviava pero no lo podia recibir y incluso invente un metodo pero no funciono (guardarlo en el disco y enviar ese archivo) cuando llege a mi casa(ubicada en la punta del cerro literalmente) pruebo el codigo que me dejaron (analizarlo pero no copiarlo jamas!!) gracias por su ayuda  ;) :P :o



PD: Estado anilizando el codigo (aun no lo he probado) si BufferedImage no es serialiable aqui tu lo haces serializable  (:o que fantastico) hoy trabajare en eso si es que tengo tiempo gracias.
EOF = end of file eso significa cierto tendra algo que ver con el problema tendre que verlo
PD:Disculpame CasiDiablo no pude revisar tu codigo pero tengo uno mejor
es algo asi envias el BufferedImage a traves de ImageIO.write(image,"jpg",OutputStream) ese OutputStream es del socket
y en el cliente si resiviste informacion  anterior para que el metodo no te haga reset uno llama al metodo InputStream.markSuport() y recibe la imagen conImageIO.read(InputStream) pero hay un problema se queda pegado en esa sentencia a menos que cierre el server
« Última modificación: 3 Septiembre 2007, 22:24 pm por egyware » En línea

passatempo

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: enviar un BufferedImage a travez de socket
« Respuesta #6 en: 3 Diciembre 2010, 02:04 am »

Reviviendo este post, la imagen no la puedes abrir por que falto un

out.close();

después de 

ImageIO.write(bufferedImage, "jpg", out);

en la parte del receptor.
Agregenlo y asi queda finalizada la imagen.
BTW excelente programa  ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
La clase BufferedImage
Java
Proteus1989 9 8,127 Último mensaje 29 Abril 2012, 13:15 pm
por Proteus1989
toolkitimage to bufferedimage
Java
mapers 0 1,270 Último mensaje 3 Febrero 2013, 21:18 pm
por mapers
Enviar class por socket send windows
Programación C/C++
patilanz 9 2,996 Último mensaje 29 Mayo 2014, 08:20 am
por eferion
Ayuda error al enviar imagen por socket C#
.NET (C#, VB.NET, ASP)
boy-ka 3 4,219 Último mensaje 25 Junio 2015, 06:54 am
por El Benjo
BIOS Fake a travez de LKM?
GNU/Linux
oPen syLar 2 2,133 Último mensaje 2 Julio 2016, 22:15 pm
por oPen syLar
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines