ok, almeno è un punto di partenza. Ho provato una soluzione del genere: l'errore però è sempre lo stesso, cioè s.getOutputStream

Server
codice:
import java.util.*;
import java.net.*;
import java.io.*;

public class Server {
    private static final int SERVER_PORT = 9977;
    private static final String SEND_DIR = "C:/mamma.class";
    private static final String SAVE_DIR = "C:/HelloWorld.class";
    private Socket socket;
        
    
    public static void main (String[] args) throws Exception{
        File file=null;
        Socket s =null;
        
        ServerSocket ss = new ServerSocket(SERVER_PORT);
        System.out.println("Sono sulla " + ss);

        s = ss.accept();
        System.out.println("Conessione da " + s);

        System.out.println("presa in carico nuova connessione da " + s);
        
        System.out.println("Server accepts");

        BufferedInputStream inn = new BufferedInputStream(s.getInputStream());
        BufferedOutputStream ut = new BufferedOutputStream(new FileOutputStream(new File(SEND_DIR)));

        byte[] buff = new byte[1024];
        int readMe;

        while( (readMe = inn.read(buff)) >= 0) {
            ut.write(buff, 0, readMe);
        }
        
        inn.close();
        ut.flush();
        ut.close();
        
        System.out.println("Server ha ricevuto il file");
        
        
        BufferedInputStream fileIn = null;
        BufferedOutputStream out = null;
        
        file=new File(SEND_DIR);
        fileIn = new BufferedInputStream(new FileInputStream(file));
        out = new BufferedOutputStream(s.getOutputStream());
        byte[] buffer = new byte[1024];

        int numRead;

        while( (numRead = fileIn.read(buffer)) >= 0) {
           out.write(buffer, 0, numRead);
        }
        
        out.flush();
        out.close();
        fileIn.close();
        
        System.out.println("Server ha inviato il file");
        
        s.close();
        
    }
}


Client
codice:
public class Client {
    private static final String SERVER_HOST = "127.0.0.1";
    private static final int SERVER_PORT = 9977;
    private static final String SAVE_DIR = "C:/Result/mamma.class";
    private static final String SEND_DIR = "F:/HelloWorld.class"; 
    
    
    
    
    public static void main (String[] args) throws Exception{
        Socket socket = null;
        File file=null;
        try {
            socket = new Socket(SERVER_HOST, SERVER_PORT);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        System.out.println("Client Connesso" + socket);
        
        BufferedInputStream fileIn = null;
        BufferedOutputStream out = null;
        
        file=new File(SEND_DIR);
        fileIn = new BufferedInputStream(new FileInputStream(file));
        out = new BufferedOutputStream(socket.getOutputStream());
        byte[] buffer = new byte[1024];

        int numRead;

        while( (numRead = fileIn.read(buffer)) >= 0) {
           out.write(buffer, 0, numRead);
        }
        
        out.flush();
        out.close();
        fileIn.close();
        
        System.out.println("Client ha inviato il file");
        
        BufferedInputStream inn = new BufferedInputStream(socket.getInputStream());
        BufferedOutputStream ut = new BufferedOutputStream(new FileOutputStream(new File(SAVE_DIR)));

        byte[] buff = new byte[1024];
        int readMe;

        while( (readMe = inn.read(buff)) >= 0) {
            ut.write(buff, 0, readMe);
        }
        
        inn.close();
        ut.flush();
        ut.close();
        
        System.out.println("Client ha ricevuto il file");
        
        socket.close();

    }
}
a quanto pare nel momento in cui eseguo inn.close() sul server è come se si chiudesse il socket. Se "commento" quella riga infatti mi si creano entrembe i file ma ovviamente non mi si chiudono...come risolvo?