Calcular velocidade de transferencia?

olá pessoal,

estou usando sockets para transferir arquivos, mas mostaria de saber a velocidade em q esta sendi transmitido o arquivo como faria isso ?

Basta contar quantos bytes você enviou por segundo. Para tanto, use o método System.currentTimeMillis() e um contador.

tem um exemplo?

O tempo em System.currentTimeMillis() é em milissegundos. O valor retornado sozinho não tem significado nenhum; apenas a diferença entre dois desses valores (tempo transcorrido) é significativa.

Se você quer saber a velocidade em megabits por segundo, então divida o número de bytes por 1024*1024, multiplique pelo número de bits em um byte (que é 8), e então divida pelo número de milissegundos, e multiplique por 1000 (que é o número de milissegundos em um segundo).

Exemplo: em 23456 milissegundos, foram trafegados 1234567 bytes. A velocidade em megabits por segundo é 1234567 / (1024.0 * 1024.0) * 8 / 23456 * 1000 = 0,40 megabits/segundo.

Cuidado se o número de milissegundos der zero. Você não quer que seu programa dê um resultado de “divisão por zero”.

Pode utilizar FilterInputStream ou FilterOutputStream para implementar um Stream com faça esses calculos.
Como todos os bytes têm que passar por aqui é fácil contá-los. Depois com alguns métodos do tipo getVelocidade ou melhor ainda, usando o padrão Observer vc pode usar essa informação em outros objetos.

olha eu uso esse daki



     long timeElapsed =  (System.currentTimeMillis() - timeStarted);
     downloadRate = ((downloaded / 1000.0) / (timeElapsed / 1000.0));


      NumberFormat nf = NumberFormat.getNumberInstance();
        System.out.println(nf.format( downloadRate ));
        String velocidade = nf.format( downloadRate );
       

basicamente funciona so tem que colocar no lugar certo do codigo senão retorna que a velocidade é infinita ou nao retorna nada XD

e downloaded é o tento que já foi baxado

ola pessoal,
as dicas q vcs me deram foram uteis mais ainda tenho duvidas… sera q com socket seria a melhor maneira de tranferir arquivos?
e como seria uma boa rotina q faca isso alguem tem exemplo de uma implementada com a taxa transferencia?
estou tentando otimizar aki mas ta dificil…
grato.

Se for via rede, você tem duas opções:
a) Transferir usando sockets (TCP/IP)
b) Transferir usando datagram sockets (UDP).

Geralmente, a transferência de arquivos usando TCP é mais rápida. O ideal é você usar um protocolo conhecido, como FTP.

No caso do Java, você pode substituir o socket pela classe SocketChannel. Geralmente é possível obter melhor escalabilidade com ela, já que suporta Selectors. Agora, ela continua usando sockets comuns.

Em uma rede local, para transferência de arquivos, eu recomendo usar o rsync.

Esse protocolo é incremental e se você tiver 2 diretórios sincronizados, irá mandar apenas a diferença.

http://rsync.samba.org/