Thank you for your help and sorry for the long time of this response
Yes, both the server and the client are different .pde files
Yes, both ImagenSerializable
are defined as different classes inside each scketch in their own .pde file (both files are equal but not the same)
When I do that and try to run the scketch it says that static is an illegal modifier for the class
The Serializable interface requires the class implementing int to be static
This is the code in case it helps:
// NCliente/NCliente.pde
import processing.net.*;
import java.io.*;
Client cliente = new Client(this, "62.151.23.106", 5204);
PImage rana;
void setup() {
size(858, 536);
rana = loadImage("data/frog.jpg");
enviarImagen(rana);
}
void draw() {
background(0);
image(rana, 0, 0);
}
void enviarImagen(PImage imagen) {
try {
ImagenSerializable imagenSerializable = new ImagenSerializable(imagen);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(imagenSerializable);
byte[] datos = baos.toByteArray();
baos.close();
oos.close();
String tamanoDatos = String.format("%8d", datos.length).replace(" ", "0");
cliente.write(tamanoDatos);
cliente.write(datos);
} catch (Exception e) {
e.printStackTrace();
}
}
// NServidor/NServidor.pde
import processing.net.*;
import java.io.*;
Server servidor = new Server(this, 5204);
PImage imagenRecibida;
int tamanoDatos = -1;
byte[] datosIncompletos = new byte[0];
void setup() {
size(858, 536);
}
void draw() {
background(0);
if (imagenRecibida != null) image(imagenRecibida, 0, 0);
}
void clientEvent(Client cliente) {
byte[] datosRecibidos = splice(cliente.readBytes(), datosIncompletos, 0);
datosIncompletos = new byte[0];
while (datosRecibidos.length > 0) {
// Determinar el tamaño de los datos recibidos
if (datosRecibidos.length >= 8) {
if (tamanoDatos == -1) {
tamanoDatos = byteArrayAInteger(subset(datosRecibidos, 0, 8));
datosRecibidos = subset(datosRecibidos, 8);
}
} else {
datosIncompletos = datosRecibidos;
return;
}
// Procesar los datos si hay suficientes
if (datosRecibidos.length >= tamanoDatos) {
try {
ByteArrayInputStream bais = new ByteArrayInputStream(datosRecibidos);
ObjectInputStream ois = new ObjectInputStream(bais);
ImagenSerializable imagenSerializable = (ImagenSerializable)ois.readObject();
imagenRecibida = imagenSerializable.aImagen(this);
bais.close();
ois.close();
datosRecibidos = subset(datosRecibidos, tamanoDatos);
tamanoDatos = -1;
} catch (Exception e) {
e.printStackTrace();
}
} else {
datosIncompletos = datosRecibidos;
return;
}
}
}
int byteArrayAInteger(byte[] bytes) {
int numero = 0;
for (int i = 0; i < bytes.length; i++) numero += Character.getNumericValue(bytes[i]) * pow(10, 7 - i);
return numero;
}
// NCliente/ImagenSerializable.pde
// NServidor/ImagenSerializable.pde
static class ImagenSerializable implements Serializable {
private static final long serialVersionUID = 1L;
int formato;
int ancho;
int alto;
int[] pixeles;
ImagenSerializable(PImage imagen) {
this.formato = imagen.format;
this.ancho = imagen.width;
this.alto = imagen.height;
this.pixeles = imagen.pixels;
}
PImage aImagen(PApplet pApplet) {
PImage imagen = pApplet.createImage(ancho, alto, formato);
imagen.pixels = pixeles;
return imagen;
}
}
Thank you