Nel ciclo del server (dove ricevi i dati da scrivere nel file):


codice:
while ((read = inputStream.read(buf)) != -1) {
   dataSocket.receive(dataPacket);
   tot += read;
   fos.write(nome.getBytes());
}

La parte che ho sottolineato: continui a scrivere dentro al file i byte (codificati col charset di default) della stringa contenente il nome del file... e già questo non ha alcun senso... devi scrivere nel file il pacchetto di dati che hai ricevuto... non il nome del file.


Poi, da nessuna parte effettui un flush() dei dati (consigliabile, perchè nessuno ti garantisce che la quantità di dati ricevuta sia sufficiente a riempire l'eventuale buffer, né qualcuno ti garantisce che i dati siano effettivamente scritti nel file dal sistema sottostante), e nemmeno la chiusura del FileOutputStream, cosa necessaria: quando si ha finito di usare un file, lo si deve sempre chiudere.


Ciao.