2010-08-20 5 views
5

Est-ce que quelqu'un a des conseils sur la façon de calculer l'utilisation de la bande passante d'une socket? Par exemple, comme j'envoie des données sur un socket au serveur auquel je suis connecté, je veux montrer le Kb/s qui est envoyé.Calcul de la vitesse de bande passante des données envoyées/reçues sur une socket?

La recherche Google n'a rien révélé d'utile. Peut-être que je cherche les mauvais termes.

+0

Cet article pourrait vous donner quelques idées: http://www.roseindia.net/javatutorials/counting_bytes_on_sockets.shtml – darri

Répondre

5

Le meilleur que vous allez probablement être facilement est faire est d'enregistrer lorsque vous commencez à écrire, puis compter les octets que vous avez envoyé avec succès à la méthode Socket.getOutputStream.write(). Pour une petite quantité de données, cela sera très imprécis, car il suffit de remplir le tampon de transmission du système d'exploitation, ce qui prendra au départ beaucoup plus de temps qu'il n'en envoie.

Il convient toutefois d'amortir essentiellement le débit correct sur une quantité relativement importante de données.

+0

Cela fonctionnerait en théorie, mais il ne fournirait pas une représentation très précise de la vitesse de transfert au courant moment. Par exemple: Si je me suis connecté pendant 5 minutes ... j'ai passé les 2,5 premières minutes à ne rien faire, et les 2,5 dernières minutes à envoyer 100 kb/s. À la fin des 5 minutes, il me dirait que la vitesse était de 50kb/s en moyenne. Je ne cherche pas la vitesse moyenne depuis que j'ai commencé à transmettre. Je cherche la vitesse actuelle. Peut-être que la moyenne des 5 dernières secondes marcherait, mais je n'ai aucune idée d'enregistrer quelque chose comme ça. –

+1

Cela s'appelle une moyenne mobile: http://en.wikipedia.org/wiki/Moving_average. C'est assez simple à calculer, bien qu'il existe plusieurs méthodes. Il n'y a vraiment pas de calcul de la bande passante à un moment donné; Puisque les données sont discrètes, vous devez avoir une moyenne. Une méthode extrêmement simple serait 'average = (average + new_measurement_average)/2.0'. –

+2

Remarque: Le [CountingOutputStream] de Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/CountingOutputStream.html) facilite l'encapsulation d'un flux de sortie avec un autre flux qui compte le nombre d'octets qu'il a écrit. –

Questions connexes