Ti basta creare un socket per i messaggi e l'altro per i trasferimenti. flush è necessario: senza non hai garanzia che il buffer di scrittura sia effettivamente svuotato del tutto... potresti trovarti in situazioni in cui il file viene creato, ma le dimensioni, seppure non 0, siano diverse. Flush obbliga lo stream a svuotarsi per cui tanto viene letto e tanto viene scritto, sempre e comunque.