Il concetto di base che hai usato, cioè serializzare degli oggetti che rappresentano dei "messaggi" va bene ed è anche sicuramente comodo.
Io però suggerirei di non fare una unica classe Messaggio, ma di fare una gerarchia di classi per i messaggi! Una classe astratta Messaggio e poi sottoclassi concrete come ad es. MessaggioInfoFile, MessaggioDatiFile, ecc....
Nel ricevente basta leggere l'oggetto, fare dei test con instanceof e poi un cast. Niente flag o roba del genere. Ha anche più senso, visto che così si può "specializzare" meglio un tipo di messaggio con le proprietà peculiari del messaggio. Se devi solo indicare un fine trasferimento, perché dovresti creare un Messaggio che invece "sa" di avere anche un array di dati???
Per il resto ... cose del tipo:
codice:
tmp = new byte[ letto.getQuanti() ];
for (int j=0; j<tmp.length; j++)
tmp[j] = letto.getData()[j];
non hanno molto senso! Se il messaggio contiene un array, fatti restituire il reference all'array, il numero di byte e scrivi direttamente quello!
Pure la lettura nel uploader si può fare in modo più furbo con:
codice:
int quanti;
while ((quanti = fis.read (dati)) > 0)
out.writeObject (new Messaggio (dati, quanti, Messaggio.FILE_DATA));