Eu fiz um código simples que envia um objeto para um cliente via socket.
public void iniciarServer(){
        try {
            server = new ServerSocket(porta);
            System.out.println("Servidor iniciado na porta "+porta);
            System.out.print("IP do servidor: "+Inet4Address.getLocalHost());
            System.out.println("");
            while(true){
                cliente = server.accept();
                System.out.println("Cliente conectado: "+cliente.getInetAddress().getHostName());
                output = new ObjectOutputStream(cliente.getOutputStream());
                output.flush();
                output.writeObject("Essa mensagem foi enviada pelo servidor");
                output.close();
                cliente.close();
            }
            
            
        } catch (IOException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
Eu até consegui enviar uns arquivos com um vetor de bytes, mas surgiu uma dúvida:
Caso eu queira enviar vários arquivos, o cliente precisaria saber quando o arquivo atual acaba e quando o novo começa. Ou então, o servidor precisaria saber quando o cliente termina de gravar o arquivo. Também sei que ao mesmo tempo que o arquivo é recebido, ele precisa já ir sendo gravado para a memória ram não limitar o tamanho máximo dele. Não faço ideia de como fazer isso, alguém sabe?