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:import java.io.*;
import java.net.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class Receptor{
public void ejecutarServidor() {
try {
while ( true ) {
try {
esperarConexion();
System.
out.
println( "\nSe recibieron los flujos de entrada\n" ); procesarConexion();
System.
err.
println( "El servidor terminó la conexión" ); excepcionEOF.printStackTrace();
} finally {
cerrarConexion(); // Paso 5: cerrar la conexión.
}
} // fin de instrucción while
} // fin del bloque try
excepcionES.printStackTrace();
}
} // fin del método ejecutarServidor
// esperar que la conexión llegue, después mostrar información de la conexión
System.
out.
println( "Esperando una conexión\n" ); conexion = servidor.accept(); // permitir al servidor aceptar la conexión
System.
out.
println( "Conexión recibida de: " + conexion.
getInetAddress().
getHostName() ); }
// procesar la conexión con el cliente
do { // procesar los mensajes enviados por el cliente
// leer el mensaje y mostrarlo en pantalla
try {
byte[] bytesImagen = (byte[]) entrada.readObject();
String nombreFichero
=System.
getProperty("user.home")+File.
separatorChar+"captura.jpg"; System.
out.
println("Generando el fichero: "+nombreFichero
); // esbribe la imagen a fichero
ImageIO.write(bufferedImage, "jpg", out);
}
// atrapar problemas que pueden ocurrir al tratar de leer del cliente
System.
out.
println( "\nSe recibió un tipo de objeto desconocido" ); }
} while ( true );
} // fin del método procesarConexion
// cerrar flujos y socket
private void cerrarConexion() {
System.
out.
println( "\nFinalizando la conexión\n" ); try {
entrada.close();
conexion.close();
excepcionES.printStackTrace();
}
}
public static void main
( String args
[] ) { Receptor aplicacion = new Receptor();
aplicacion.ejecutarServidor();
}
}
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.import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import java.io.Serializable;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
public class Cliente{
public Cliente
( String host
) { servidorChat = host; // establecer el servidor al que se va a conectar este cliente
}
private void ejecutarCliente() {
try {
conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
salida.flush(); // vacíar búfer de salida para enviar información de encabezado
System.
out.
println( "\nSe recibieron los flujos de E/S\n" ); enviarDatos();
System.
err.
println( "El cliente termino la conexión" ); }
// procesar los problemas que pueden ocurrir al comunicarse con el servidor
excepcionES.printStackTrace();
}
finally {
cerrarConexion(); // Paso 4: cerrar la conexión
}
} // fin del método ejecutarCliente
// conectarse al servidor
System.
out.
println( "Intentando realizar conexión\n" ); // crear Socket para realizar la conexión con el servidor
// mostrar la información de la conexión
System.
out.
println( "Conectado a: " + cliente.getInetAddress().getHostName() );
}
// cerrar flujos y socket
private void cerrarConexion() {
System.
out.
println( "\nCerrando conexión" ); try {
salida.close();
cliente.close();
excepcionES.printStackTrace();
}
}
private void enviarDatos( ) {
try {
BufferedImage bufferedImage
= robot.
createScreenCapture(rectangleTam
); ImageIO.write(bufferedImage, "jpg", salidaImagen);
byte[] bytesImagen = salidaImagen.toByteArray();
salida.writeObject( bytesImagen );
salida.flush();
System.
out.
println( "Se ha enviado la imagen" ); e.printStackTrace();
} // procesar los problemas que pueden ocurrir al enviar el objeto
System.
out.
println( "\nError al escribir el objeto" ); }
}
public static void main
( String args
[] ) { Cliente aplicacion;
if ( args.length == 0 )
aplicacion = new Cliente( "127.0.0.1" );
else
aplicacion = new Cliente( args[ 0 ] );
aplicacion.ejecutarCliente();
}
} // fin de la clase Cliente
El programa funciona!!! Pero... me sale una excepción que no he sabido depurar:
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