int numByte2 = in2.read(messaggioByte);
messaggioByte = Arrays.copyOf(messaggioByte , numByte2);
Beh, copyOf riceve una lunghezza e la lunghezza è dinamica perché la ricevi da uno stream.
EDIT: scusa, oggi sono un po' nelle curve ... non avevo visto che gli passi l'array.
Quel read può ritornare -1 se non ci sono più dati (end of stream).