Arquivos via socket

Olá…sei que já tem vários tópicos referentes a isso, mas tentei fazer uma boa quantidade de exemplos e ainda não funcionou…
Descrição…
Presciso enviar arquivos, não necessáriamente de texto, pode ser um jar, um .mp3, qualquer tipo… de um servidor para um cliente…

então criei duas classes, uma no cliente e outra no servidor

Método de envio:

 private void enviar(File f) throws IOException {

        if (f.isFile()) {

           
            BufferedInputStream is = new BufferedInputStream(new FileInputStream(f));

            byte[] buff = new byte[1024];
           
            int len = 0;
            
            while ((len = is.read(buff)) != -1) {
                  output.write(buff);
                  output.flush();
             }
       
        }


       

    }

e no cliente o método de recebimento

 private void receberArquivo() throws FileNotFoundException, IOException{




                    File file = new File(getNomeArquivo());
                    byte[] buff = new byte[1024];

                    BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
                    Long size = getTamanhoArquivo();
                    while (size > 0) {
                        int len = input.read(buff);
                     
                        if (len == -1) {
                            break;
                       }
                        os.write(buff, 0, len);
                        size -= len;
                    }
                  
                    os.close();
                  

                  

    }

o código até que funciona, mas não transmite e nem recebe todo o arquivo, por exemplo…quero enviar um arquivo de uns 5 MB e recebe só uns 150 k… não sei o que está havendo…se alguém já passou por isso…me ajude

Obrigado

[Editado]
ah…antes que eu esqueça…
o input e output são variáveis do tipo ObjectInputStream e ObjectOutputStream inicializados através do socket.getInputStream e getOutputStream…

Vou dar um chute…
O que pode estar acontencendo é quando você busca o tamanho do arquivo (provavelmente no método getTamanhoArquivo()), ele não foi totalmente escrito no buffer pelo outro método (enviar(File f)). Dica: antes de começar a ler os bytes do arquivo, dá um Thread.sleep() de alguns segundos só para garantir que seu método está funcionando corretamente. Se sim, você parte para bolar uma solução para contornar esse problema do tempo sem utilizar o sleep().

Obs.: Não deixe o código utilizando o Thread.sleep(), pois dependendo da latência da rede, esse tempo que você designar vai ruim ou bom para a aplicação.

[]'s.