Il metodo flush serve per svuotare il buffer di scrittura (tu usi infatti dei BufferedWriter).
Altrimenti java svuoterebbe il buffer quando è pieno, come ottimizzazione interna.

Siccome tu ti metti poi a fare una read() allora il flush lo devi fare esplicitamente (ovvimente dopo la println),
o settare il flag autoflash sull'oggetto PrintWriter.

Riguardo ai reader/writer sì vanno chiusi e poi chiudi il socket,
vedi per esempio qui:
http://docs.oracle.com/javase/tutori...ngWriting.html

Ciao.