Per mettere in ascolto il server si utilizza la classe ServerSocket che ha definito al suo interno il metodo accept() (capace di porre il server in attesa fino alla connessione di un client).
Il client, d'altra parte, utilizzera un oggetto della classe Socket per connettersi ad un server (il quale, naturalmente, deve già essere in attesa tramite il procedimento a cui mi riferivo prima).
Dunque client e server comunicano tramite un socket, e tramite questo socket tu trasferirai i dati che ti interessa far giungere al server (o al client, è indifferente).
Nel tuo specifico caso, i dati da spedire sono file, dunque dovresti leggere il file da una parte e spedirlo dall'altra (facendo uso del socket il quale ha uno stream di input e uno di output).
Quello che devi fare è leggere il file tramite un FileInputStream, porre le porzioni del file lette in un array di byte e spedirle al ricevente; questo fino a quando il file non viene letto completamente.
Dall'altra parte invece ci sarà il ricevente, che dal canto suo ricevera questo flusso di byte e li scriverà tramite un FileOutputStream nel file finale.
Studiati le classi cardine (Socket, ServerSocket, FileInputStream, FileOutputStream) e la gestione degli stream in java.
Non è nulla di complicato se si studia. Il problema è, appunto, studiare