Medir el ancho de banda de una conexión en tiempo real

Hola
Como dice el título, la idea es medir en tiempo real el ancho de banda de la conexión a internet para, según el estado en el que esté, hacer peticiones a servidores para descargar archivos o código fuente de páginas web.

Imagen

En la imagen pueden ver el ejemplo de un programa que hace lo que necesito. Mide el ancho de banda de mi conexión mientras descargo torrents, veo videos de youtube, etc. No confundir con medir la velocidad de mi conexión, eso ya se como hacerlo y no es lo mismo.

No duden en consultar cualquier cosa que necesiten, Gracias!!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Y cual es la diferencia entre

Y cual es la diferencia entre medir el acho de banda y medir la velocidad de conexión?

Corrección

Hola OscarRyz, gracias por responder. Fue un error mio de expresión.

A lo que me refiero con velocidad de conexión (que sería en realidad ancho de banda) es lo que contrate al proveedor de internet , ej 6Mbits que serían aprox. de 768KB/s para descargar. Ese valor ya sé como obtenerlo, lo que me gustaría saber es cuanto estoy conumiendo de ese ancho de banda. Si tengo el torrents o youtube que me están consumiendo 300KB/s, quiere decir que me quedan aprox. 468KB/s disponibles para descargar más cosas.
Sabiendo esto puedo programar una aplicación en Java que se "adapte" al consumo de ancho de banda disponible sin saturar la red.

No se si me ecpliqué mejor ahora, cualquier cosa preguntame de nuevo

Imagen de ezamudio

busca libs

Tal vez Netty o alguna otra biblioteca de terceros ya traiga algo para limitar el ancho de banda que usa una conexión. Si no, pues tendrás que irte a bajo nivel e implementar tu propio manejo de las conexiones; podrías usar las clases de Java como httpurlconnection pero la cosa es que a la hora de obtener el inputstream del cual vas a leer, tienes que hacer lecturas de cierto tamaño y luego meter delays (Thread.sleep) de cierto tiempo para que al final solamente consumas el límite que hayas establecido (que a fin de cuentas es X cantidad de bytes cada cierto tiempo, llámame Mbps, MBps, kbps, bytes por segundo, bytes por minuto, etc).

Lo que quieres entonces es

Lo que quieres entonces es limitar el uso de la red. Puedes investigar usando la clase RateLimiter de Guava

En su doc hay un ejemplo similar:

 

Estuve probando...

Gracias gente por las respuestas!!!

ezamudio, estaba intentando eso ahora. Empecé a guardar la cantidad de bytes que descargaba y a enviarselo a la clase que limita el ancho de banda. La misma, cada 1 segundo, revisa cuanto descargué y de ahí calcula un estimativo del ancho de banda. Es con un delay de 1 segundo y no es tan preciso ya que lo comparé con software que miden el ancho de banda y no coincidía, pero me da un panorama de lo que estoy consumiendo. Es rústico pero cumple su objetivo...

OscarRyz, voy a investigar más a fondo la clase RedLimiter. También encontré la librería jnetpcap que te da mucha información sobre el estado de la red. Hasta ahora no puede lograr que me diga la cantidad de paquetes que se envían y reciben, pero si encontré otras funcionalidades muy interesantes.

Gracias!!