Contando Bytes enviados / recebidos através de HTTP
Pergunta
Em Java,
Como poderiam os bytes enviados e recebidos através de uma ligação HTTP activa ser contado?
Eu quero mostrar algumas estatísticas como:
Bytes Sent : xxxx Kb
Bytes Received : xxxx Kb
Duration : hh:mm
Solução
É difícil ver como você pode decorar HttpConnection para contar os bytes de dados brutos. Você poderia Reimplementar HTTP utilizando soquetes, mas isso teria de ser muito importante para ir para os comprimentos.
resposta de exemplo de stackoverflow.com
:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Mon, 21 Sep 2009 11:46:48 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
Date: Mon, 21 Sep 2009 11:46:48 GMT
Content-Length: 19452
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>...remaining data....
solicitações HTTP são razoavelmente simples, de modo que você pode tentar reconstruí-lo usando as informações que está exposto. Algo na forma:
// TODO: edge cases, error handling, header delimiter, etc.
int byteCount = 0;
int headerIndex = 0;
while (true) {
String key = httpConnection.getHeaderFieldKey(headerIndex);
if (key == null)
break;
String value = httpConnection.getHeaderField(headerIndex++);
byteCount += key.getBytes("US-ASCII").length
+ value.getBytes("US-ASCII").length + 2;
}
byteCount += httpConnection.getHeaderFieldInt("Content-Length",
Integer.MIN_VALUE);
Essa implementação é incompleto e não foi testado. Você precisaria estudar-se sobre os detalhes do protocolo HTTP para garantir a precisão da sua resultados.
Outras dicas
Enrole do HttpURLConnection getInputStream () e getOutputStream () em suas próprias correntes que contam os bytes que passam por eles. Ou melhor ainda usar a biblioteca Apache Commons IO -. Eles têm contando implementações de fluxo de lá